String 类型


是最基本的类型,string 类型是二进制安全,可以包含任何数据,。从内部实现来看其实 string 可以看作 byte 组,最大上限是 1G 字节


简单的操作命令


set key value 如果key存在,覆盖其value



setnx key value 如果key存在,返回0



get key 获取key值



getset key value 获取key值,再设置key值,key不存在返回nil 同时创建key 设置value



mget key1 key2 一次获取多个key,不存在,对应返回nil



mset key1 value1 …keyN valueN 一次设置多个key值,会覆盖原同名key



msetnx key1 value1 …keyN valueN 设置多个key值,不会覆盖已经存在的key,有已存在的key,返回0,同时未存在的不会创建



incr key 对 key 的值做++操作, 并返回新的值, 注意 incr 一个不是 int 的 value 会返回错误, incr 一个不存在的 key,则设置 key 值为 1。



decr key 对 key 的值做–操作, decr 一个不存在 key,则设置 key 值为-1。



incrby key +数字 对key加上设定的值 , key 不存在时候会设置 key,并认 为原来的 value 是 0



decrby key integer 对 key 减去指定值。decrby 完全是为了可读性,我们完全 可以通过 incrby 一个负值来实现同样效果,反之一样


String的应用场景:

如想知道什么时候封锁一个 IP 地址(访问超过几次)。 INCRBY 命令让这些变得很容易,通过原子递增保持计数,原子性多线程情况下不会出错, 统计当天登录用户,或者秒杀活动等


set u001 “两三 ,13,3423” 缺点:增加了序列化和反序列化开销,修改一项时,把整个对象取回,并且修改操作需要对并发进行保护


Hash类型


redis的hash很好解决了,内部存储是HashMap
在成员比较少的情况下,并不是真正的hashmap,采取类似一维数组的方式



hgetall :可以直接取到全部属性数据,涉及遍历整个map操作,但是redis是单线程的,其他线程会出现阻塞状态



hset name01 h haha 设置 hash field 为指定值,如果 key 不存在,则创建



hget name01 h 获取key对应的值


Redis的基本数据类型_redis

存储方式相当于

老大->老一和老一的儿子 老二和老二的儿子

获取方式

老大 ->老一 老二

hincrby的使用

Redis的基本数据类型_应用场景_02

hexists:判断是否存在

Redis的基本数据类型_应用场景_03

hdel:删除key里面指定的filed里的值

Redis的基本数据类型_应用场景_04

hlen key 返回指定的hash field数量

Redis的基本数据类型_数据_05

hkeys key 返回 hash 的所有 field

127.0.0.1:6379> hkeys name01
1) "h"
2) "h1"
3) "h2"
4) "h3"

hvals key 返回 hash 的所有 value。

127.0.0.1:6379> HVALS name01
1) "haha"
2) "haha1"
3) "haha2"
4) "haha3"

hvals key 返回 hash 的所有 value。

应用场景:

根据用户id:查找对应的name age birthday等信息

set u001 "李三,18,20010101"

增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入 CAS 等复杂问题。

List类型

127.0.0.1:6379> lpush name00 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> rpush name00 1 2 3 4 5 6
(integer) 12

lpush是从不断的从左边插入,所以输出的是倒序,rpush不断从右边插入,输出的是正序

127.0.0.1:6379> lrange name00 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "1"
8) "2"
9) "3"
10) "4"
11) "5"
12) "6"

截取list中的数据 ltrim

127.0.0.1:6379> LTRIM name00 0 5
OK
127.0.0.1:6379> lrange name00 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"

lset key indexvalue 设置 list 中指定下标的元素值,成功返回 1, key 或者下

标不存在返回

127.0.0.1:6379> lset name00 5 he
OK

lrem key count value 从 List 的头部 ( count 正数)或尾部 ( count 负数)

删除一定数量 ( count)匹配 value 的元素,返回删除的元素数量。 count 为 0

时候删除全部

127.0.0.1:6379> lrem name00 2 6 从左边在name00中删除 一次删除 2个6

从 list 的头部删除并返回删除元素。如果 key 对应 list 不存在或者是空返回 nil,如果 key 对应值不是 list 返回错误

lpop key

从左到右扫描,返回对第一个非空 list 进行

lpop 操作并返回,比如 blpop list1 list2 list3 0 ,如果 list 不存在

list2,list3 都是非空则对 list2 做 lpop 并返回从 list2 中删除的元素。如果所

有的 list 都是空或不存在,则会阻塞 timeout 秒, timeout 为 0 表示一直阻塞。

当阻塞时,如果有 client 对 key1…keyN 中的任意 key 进行 push 操作, 则第一

在这个 key 上被阻塞的 client 会立即返回。 如果超时发生, 则返回 nil。有点像

unix 的 select 或者 poll

blpop key1 ......keyN timeout

实现方式:list的实现为一个双向链表,支持反向查找和遍历,不过增加了部分额外的内存开销

Set 类型

无序集合,最大可以包含(2 的 32 次方-1)个元素。 set 的是通过 hashtable 实

现的,所以添加, 删除, 查找的复杂度都是 O(1)。 hash table 会随着添加或者

删除自动的调整大小

添加一个元素到set中

sadd name2 he2

移除

srem name2 he2

随机取一个元素

srandmember name2
"h5"

将name2中的h3移到name3中

smove name2 name3 h3

查看key的中个数


scard name2


查看name2中是否有h3

sismember name2 h3

sinter:取所有key的交集

sinterstore keyValue key1 key2 … 将key1 … 交集给keyValue

sunion 并集

sunionstore keyValue key1 key2 … 将key1 … 并集给keyValue

sdiff 差集

sdiffstore keyValue key1 key2 … 将key1 … 并集给keyValue

应用:每个人的好友存在一个集合(set)中,这样求两个人的共同好友

的操作,可能就只需要用求交集命令即可。

Sorted Set:有序的set

zadd key score member 添加元素到集合,元素在集合中存在则更新对应 score。

zrem key member 删除指定元素, 1 表示成功,如果元素不存在返回 0。

zincrby key incrmember 增加对应 member 的 score 值, 然后移动元素并保

持 skip list 保持有序。返回更新后的 score 值。

zrank key member 返回指定元素在集合中的排名(下标), 集合中元素是按 score

从小到大排序的。

zrevrankkey member 同上,但是集合中元素是按 score 从大到小排序

e zrange key start end 类似 lrange 操作从集合中去指定区间的元素。返回的是

有序结果

e zrevrange key start end 同上,返回结果是按 score 逆序的。

e zrangebyscore key min max 返回集合中 score 在给定区间的元素。

t zcount key min max 返回集合中 score 在给定区间的数量。

d zcard key 返回集合中元素个数。

e zscore key element 返回给定元素对应的 score

应用场景:需要排序的,比如成绩,学号,以及网易云音乐排行榜等

orted set 的 score 值设置成过期时间的时间戳,那么就

可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除 Redis 中的过期数据,

你完全可以把 Redis 里这个过期时间当成是对数据库中数据的索引,用 Redis 来找出哪些

数据需要过期删除,然后再精准地从数据库中删除相应的记录

​​

​​​​

可以在线编辑redis命令