Redis 字符串(String)
简介
- String 类型是二进制安全的。意味着 Redis 的 string可以包含任何数据。比如 jpg图片 或者序列化的对象。
- String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 vaue 最多可以是 512M
应用场景
- 缓存对象
- 直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"xiaolin", "age":18}'
- 计数
- 比如计算访问次数、点赞、转发、库存数量
- 分布式锁
- SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁
- 如果 key 不存在,则显示插入成功,可以用来表示加锁成功
- 如果 key 存在,则会显示插入失败,可以用来表示加锁失败
- SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁
- 共享 Session 信息
常用命令
# 添加键值对,没有就添加,有就覆盖
set <key> <value>
# 查询对应键值
get <key>
# 将给定的 <value> 追加到原值的末尾
append <key> <value>
# 获得值的长度
strlen <key>
# 只有在 key 不存在时,才能设置 key 的值
setnx <key> <value>
# 将 key 中储存的数字值增 1 ,只能对数字值操作,如果为空,新增值为 1
incr <key>
# 将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增为 -1
decr <key>
# 将 key 中储存的数字值增减。自定义步长
incrby / decrby <key> <步长>
# 同时设置一个或多个 key - value 对
mset <key1> <value1> <key2> <value2> ...
# 同时获取一个或多个 value
mget <key1> <key2> <key3> ...
# 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
# 会保证原子性,一个失败,全部失败
msetnx <key1> <value1> <key2> <value2> ...
# 获取值的范围,类似 java 中的 substring,前包,后包
getrange <key> <起始位置> <结束位置>
# 用 <value> 覆写 <key> 所储存的字符串值,从<起始位置>开始(索引从 0 开始)
setrange <key> <起始位置> <value>
# 设置过期时间,单位是秒
setex <key> <过期时间> <value>
# 以新换旧,设置了新值同时获得旧值
getset <key> <value>
Redis 列表(List)
简介
- Redis列表是简单的字符串列表,按照插入顺序排序
- 你可以添加一个元素到列表的头部(左边)或者尾部(右边)
数据结构
- 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节
点性能会较差
应用场景
- 消息队列
常用命令
# 从左边插入
lpush k1 v1 v2 v3
# 从右边插入
rpush k2 v1 v2 v3
# 从左边/右边吐出一个值。值在键在,值光键亡
lpop/rpop <key>
# 从<key1>列表右边吐出来一个值,插到<key2>列表左边
rpoplpush <key1><key2>
# 按照索引下标获得元素(从左到右) lrange k1 0 -1 , 这个就是查全部
lrange <key><start><stop>
# 按照索引下标获得元素(从左到右)
lindex <key><index>
# 获得列表长度
llen <key>
# 在<value>的前面/后面插入<newvalue>插入值
linsert <key> before/after <value> <newvalue>
# 从左边删除 n 个 value(从左到右)
lrem <key> <n> <value>
# 将列表 key 下标为 index 的值替换为 value
lset <key> <index> <value>
Redis 集合(Set)
简介
- Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据时,set是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的
- Redis 的 set 是 string 类型的无序集合,它底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是O(1)
数据结构
- Set 数据结构是 dict 字典,字典用哈希表实现的
应用场景
点赞
Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。uid:1 、uid:2、uid:3 三个用户分别对 article:1 文章点赞了。
SADD article:1 uid:1
(integer) 1
SADD article:1 uid:2
(integer) 1
SADD article:1 uid:3
(integer) 1
> SREM article:1 uid:1
(integer) 1
SMEMBERS article:1
"uid:3"
"uid:2"
SCARD article:1
(integer) 2
SISMEMBER article:1 uid:1
(integer) 0 # 返回0说明没点赞,返回1则说明点赞了
共同关注
Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等。key 可以是用户id,value 则是已关注的公众号的id。
uid:1 用户关注公众号 id 为 5、6、7、8、9,uid:2 用户关注公众号 id 为 7、8、9、10、11。
# uid:1 用户关注公众号 id 为 5、6、7、8、9
> SADD uid:1 5 6 7 8 9
(integer) 5
# uid:2 用户关注公众号 id 为 7、8、9、10、11
> SADD uid:2 7 8 9 10 11
(integer) 5
# 获取共同关注
SINTER uid:1 uid:2
"7"
"8"
"9"
SDIFF uid:1 uid:2
"5"
"6"
SISMEMBER uid:1 5
(integer) 1 # 返回0,说明关注了
SISMEMBER uid:2 5
(integer) 0 # 返回0,说明没关注
- 抽奖活动
- 先将所有人加入到集合中
- 如果允许重复中奖使用 srandmember
- 如果不允许重复中奖使用 spop
常用命令
# 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
sadd <key> <value1> <value2> ...
# 取出该集合的所有值
smembers <key>
# 判断集合<key>是否为含有该<value>值,有1,没有0
sismember <key> <value>
# 删除集合中的某个元素
srem <key> <value1> <value2> ...
# 随机从该集合中吐出一个值
spop <key>
# 随机从该集合中取出n个值,不会从集合中删除
srandmember <key> <n>
# 返回两个集合的 交集 元素
sinter <key1> <key2>
# 返回两个集合中的 并集 元素
sunion <key1> <key2>
# 返回两个集合的 差集 元素(key1中的,不包含 key2 中的)
sdiff <key1> <key2>
Redis 哈希(Hash)
简介
- Redis hash 是一个键值对集合
- Redis hash 是一个 string 类型的 field 和 value 的映射表, hash 特别蛇和用于存储对象,类似于 Java 里面的 Map<String, Object>
应用场景
- 缓存对象
常用命令
# 给 <key> 集合中的 <field> 键赋值 <value>
hset <key> <field> <value>
# 从 <key> 集合 <field> 取出 value
hget <key> <field>
# 批量设置 hash 的值
hmset <key> <field1> <value1> <field2> <value2> ...
# 查看哈希表 key 中,给定域 field 是否存在
hexists <key> <value>
# 列出该 hash 集合的所有 field
hkeys <key>
# 列出该 hash 集合的所有 value
hvals <key>
# 为哈希表 key 中的域 field 的值加上增量 1 -1
hincrby <key> <field> <increment>
# 将哈希表 key 中的域 field 的值设置为 value,<u>当且仅当域 field 不存在</u>
hsetnx <key> <field> <value>
Redis 有序集合(Zset)
简介
- Redis 有序集合 zset 与 普通集合 set 非常相似, 是一个没有重复元素的字符集合
- 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
- 因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素
- 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
数据结构
- SortedSet (zset) 是 Redis 提供的一个非常特别的数据结构,一方面它等价于 Java 的数据结构Map<String, Double>,可以给每一个元素 value 赋予一个权重 score,另一方面它又类似于 TreeSet,内部的元素会按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表
- zset 底层使用了两个数据结构
- hash,hash 的作用就是关联元素 value 和权重 score,保障元素 value 的唯一性,可以通过元素 value 找到相应的 score 值
- 跳跃表,跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表
应用场景
- 排行榜
常用命令
# 将一个或多个 member 元素及其 score 值加入到有序集 key 当中
zadd <key> <score1> <value1> <score2> <value2> ...
# 返回有序集 key 中,下标在 <strat> <stop> 之前的元素,带WITHSCORES,可以让分数一起和值返回到结果集
zrange <key> <start> <stop> [WITHSCORES]
# 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max)的成员
# 有序集成员按 score 值递增(从小到大)次序排列
zrangebyscore key min max [withscores] [limit offset count]
# 同上,从大到小排序
zrevrangebyscore key max min [withscores] [limit offset count]
# 为元素的 score 加上增量
zincrby <key> <increment> <value>
# 删除该集合下,指定值的元素
zrem <key> <value>
# 统计该集合,分数区间内的元素个数
zcount <key> <min> <max>
# 返回该值在集合中的排名,从0开始
zrank <key> <value>