Redis 的基础应用场景
- 获取中奖用户ID,随机弹出之后集合中就不存在了【set】
- 存储活动中中奖的用户ID,保证同一个用户不会中奖两次【set】
- 存储粉丝列表,value 为粉丝的用户ID,score 是关注时间【zset】
- 存储学生成绩,value 为学生的ID,score 是考试成绩【zset】
- 记录帖子的点赞数、评论数、和点击率【hash】
- 记录用户的帖子ID列表,便于快速显示用户的帖子列表【zset】
- 记录帖子的标题、摘要、作者和封面信息,用于列表展示页【hash】
- 记录帖子的点赞ID列表,评论ID列表,用于显示和去重计数【zset】
- 缓存近期热帖内容,减少数据库压力【hash】
- 记录热榜帖子ID列表,总热榜和分类热榜【zset】
- 收藏和贴子之间的关系【zset】
- 缓存用户的历史行为,过滤恶意行为【zset,hash】
Redis 的基本数据类型
建值对:相当于字典的 key 和 value,支持简单的增删改查操作。
- set/get/exists/del
- mset/mget => 批量键值对
- expire => 设置过期时间
- setex => 5秒后过期,set + expire
- setnx => 如果不存在就创建,如果存在就创建不成功
- incr/incrby => value是整数,可以进行自增,自增是有范围的。
- 获取所有的key:keys *
- 清空所有的数据: flushall
127.0.0.1:6379> ## 单个键值对127.0.0.1:6379> ## 设置 key 为 name,value 为 laowen127.0.0.1:6379> set name laowen OK127.0.0.1:6379> get name ## 获取"laowen"127.0.0.1:6379> exists name ## 检查是否存在(integer) 1127.0.0.1:6379> del name ## 删除(integer) 1127.0.0.1:6379> get name ## 获取(nil)127.0.0.1:6379> set name1 boy ## 设置OK127.0.0.1:6379> set name2 girl ## 设置OK127.0.0.1:6379> mget name1 name2 # 放回一个列表1) "boy"2) "girl"127.0.0.1:6379> ## 批量添加多个127.0.0.1:6379> mset name1 boy name2 girl name3 unknowOK127.0.0.1:6379> mget name1 name2 name31) "boy"2) "girl"3) "unknow"127.0.0.1:6379> ## 设置过期时间127.0.0.1:6379> set name aOK127.0.0.1:6379> get name"a"127.0.0.1:6379> expire name 5 # 5秒后过期(integer) 1127.0.0.1:6379> get name # 不到5秒"a"127.0.0.1:6379> get name # 5秒之后(nil)127.0.0.1:6379> ## 5秒后过期,set + expire 127.0.0.1:6379> setex name 5 aaOK127.0.0.1:6379> get name"aa"127.0.0.1:6379> get name(nil)127.0.0.1:6379> ## 如果不存在就创建,如果存在就创建不成功127.0.0.1:6379> setnx name a # 如果不存在就创建(integer) 1127.0.0.1:6379> get names"a"127.0.0.1:6379> setnx name b # 如果存在就创建不成功(integer) 0127.0.0.1:6379> get name # 没有改变"a"127.0.0.1:6379> ## 计数127.0.0.1:6379> set age 20OK127.0.0.1:6379> get age "20"127.0.0.1:6379> incr age(integer) 21127.0.0.1:6379> get age "21"127.0.0.1:6379> incrby age 5(integer) 26127.0.0.1:6379> get age "26"
list 列表,注意它是链表而不是数组。
Redis的列表结构常用于做异步队列使用。队列是先进先出的数据结构,常用于消息队列和异步逻辑处理,会确保元素的访问顺序性。
当列表弹出最后一个元素之后,该数据结构被自动删除,内存被回收。
【队列:右进左出】
- rpush 尾部追加
- llen 获取长度
- lpop 头部删除
127.0.0.1:6379> ## 添加一个 books 队列127.0.0.1:6379> rpush books php java net golang (integer) 4127.0.0.1:6379> ## books 队列尾部继续添加内容127.0.0.1:6379> rpush books c(integer) 5127.0.0.1:6379> ## books 队列尾部继续添加内容127.0.0.1:6379> rpush books python(integer) 6127.0.0.1:6379> ## books 队列尾部继续添加内容127.0.0.1:6379> rpush books vue(integer) 7127.0.0.1:6379> ## 获取 books 队列的长度127.0.0.1:6379> llen books(integer) 7127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"php"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"java"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"net"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"golang"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"c"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"python"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books"vue"127.0.0.1:6379> ## 弹出 books 队列的第一个内容127.0.0.1:6379> lpop books(nil)127.0.0.1:6379>
【栈:右进右出】
- rpush 尾部追加
- llen 获取长度
- rpop 从尾部删除
127.0.0.1:6379> ## 添加一个 books 栈127.0.0.1:6379> rpush books php java net golang (integer) 4127.0.0.1:6379> ## 获取 books 栈的长度127.0.0.1:6379> llen books(integer) 4127.0.0.1:6379> ## 弹出栈尾部的内容127.0.0.1:6379> rpop books"golang"127.0.0.1:6379> ## 弹出栈尾部的内容127.0.0.1:6379> rpop books"net"127.0.0.1:6379> ## 弹出栈尾部的内容127.0.0.1:6379> rpop books"java"127.0.0.1:6379> ## 弹出栈尾部的内容127.0.0.1:6379> rpop books"php"127.0.0.1:6379> ## 弹出栈尾部的内容127.0.0.1:6379> rpop books(nil)127.0.0.1:6379>
【慢操作】
【快速列表】
hash 哈希字典
类似与字典,一个key对应一个value。适用于 key为标题,value为内容的存储。当hash移除最后一个元素之后,该数据结构被自动删除,内存被回收。
- hset key filed value 设置单个
- hget key filed 获取单个
- hgetall key 获取所有
- hdel key filed 删除单个
- hlen key 获取长度
- hmset key file value 批量设置
127.0.0.1:6379> ## 设置 name 的哈希、注意 如果字符串中包含空格、需要使用引号127.0.0.1:6379> hset name wang wangzong(integer) 1127.0.0.1:6379> hset name wen wenzong(integer) 1127.0.0.1:6379> hset name zhang zhangzong(integer) 1127.0.0.1:6379> ## 获取所有127.0.0.1:6379> hgetall name1) "wang"2) "wangzong"3) "wen"4) "wenzong"5) "zhang"6) "zhangzong"127.0.0.1:6379> ## 获取长度127.0.0.1:6379> hlen name(integer) 3127.0.0.1:6379> ## 获取单个127.0.0.1:6379> hget name wen"wenzong"127.0.0.1:6379> ## 更新单个,成功返回0127.0.0.1:6379> hset name wen wenzongbin(integer) 0127.0.0.1:6379> hget name wen"wenzongbin"127.0.0.1:6379> ## 更新单个,成功返回0127.0.0.1:6379> hset name wen xiaowen(integer) 0127.0.0.1:6379> hgetall name1) "wang"2) "wangzong"3) "wen"4) "xiaowen"5) "zhang"6) "zhangzong"127.0.0.1:6379> ## 批量 set127.0.0.1:6379> hmset name zhao zhaozong li lizong fei feizongOK127.0.0.1:6379> hgetall name 1) "wang" 2) "wangzong" 3) "wen" 4) "xiaowen" 5) "zhang" 6) "zhangzong" 7) "zhao" 8) "zhaozong" 9) "li"10) "lizong"11) "fei"12) "feizong"127.0.0.1:6379> hget name wen"xiaowen"127.0.0.1:6379> ## 删除单个127.0.0.1:6379> hdel name wen(integer) 1127.0.0.1:6379> hget name wen(nil)127.0.0.1:6379>
set 集合
Redis 的集合内部是键值对,是无序的、唯一的。
- sadd key value => 添加
- smembers key => 获取所有
- smembers key value => 检查某个值是否存在
- scard key => 获取长度
- spop key => 随机弹出
127.0.0.1:6379> ## 添加一个,不存在,返回1127.0.0.1:6379> sadd num 100 (integer) 1127.0.0.1:6379> ## 添加一个,存在, 返回0127.0.0.1:6379> sadd num 100 (integer) 0127.0.0.1:6379> ## 添加多个127.0.0.1:6379> sadd num 99 89 (integer) 2127.0.0.1:6379> ## 获取所有 127.0.0.1:6379> ## 和插入的顺序是不一致的,因为 set 是无序的127.0.0.1:6379> smembers num 1) "89"2) "99"3) "100"127.0.0.1:6379> ## 查询某个值是否存在 存在返回 1127.0.0.1:6379> sismember num 100 (integer) 1127.0.0.1:6379> ## 查询某个值是否存在 不存在返回 0127.0.0.1:6379> sismember num 90 (integer) 0127.0.0.1:6379> scard num ## 获取长度(integer) 3127.0.0.1:6379> spop num ## 随机弹出一个"100"127.0.0.1:6379> spop num ## 随机弹出一个"89"127.0.0.1:6379> spop num ## 随机弹出一个"99"127.0.0.1:6379> spop num(nil)
zset 有序列表
- zadd key score value => 添加
- zrange key 范围 => 按 score 正序列出,参数为排名范围
- zrevrange key 范围 => 按 score 逆序列出,参数为排名范围
- zcard key => 获取长度,相当于 count()
- zscore key value => 获取指定 value 的 score
- zrank key value => 获取指定 value 的排名
- zrangebyscore key 范围 => 根据 score 范围取值
- zrem key value => 删除指定 value 的 score
127.0.0.1:6379> ## 添加有序列表 zadd key score value127.0.0.1:6379> ## score:成绩127.0.0.1:6379> ## key:fan127.0.0.1:6379> ## value:wen127.0.0.1:6379> zadd fan 100 wen(integer) 1127.0.0.1:6379> zadd fan 99 zhang(integer) 1127.0.0.1:6379> zadd fan 101 li(integer) 1127.0.0.1:6379> zadd fan 98 zhao(integer) 1127.0.0.1:6379> zadd fan 97 jin(integer) 1127.0.0.1:6379> ## zrange key 范围127.0.0.1:6379> ## 按 score 正序取出;参数为范围 127.0.0.1:6379> zrange fan 0 -11) "jin"2) "zhao"3) "zhang"4) "wen"5) "li"127.0.0.1:6379> ## zrevrange key 范围127.0.0.1:6379> ## 按 score 逆序取出;参数为范围 127.0.0.1:6379> zrevrange fan 0 -11) "li"2) "wen"3) "zhang"4) "zhao"5) "jin"127.0.0.1:6379> ## zcard key 获取总数。相当于 count()127.0.0.1:6379> zcard fan(integer) 5127.0.0.1:6379> ## 获取指定 value 的 score127.0.0.1:6379> ## zscore key value127.0.0.1:6379> zscore fan wen"100"127.0.0.1:6379> ## 获取指定 value 的 排名127.0.0.1:6379> ## zrank key value127.0.0.1:6379> zrank fan wen(integer) 3127.0.0.1:6379> ## 获取指定范围的数据127.0.0.1:6379> ## zrangebyscore key 范围127.0.0.1:6379> zrangebyscore fan 99 1001) "zhang"2) "wen"127.0.0.1:6379> ## 获取指定范围的数据127.0.0.1:6379> ## zrangebyscore key -inf inf 【只有value】127.0.0.1:6379> ## zrangebyscore key -inf inf withscores 【value 和 score 同时返回】127.0.0.1:6379> ## -inf/inf 代表 infinite,无穷大的意思,∞大127.0.0.1:6379> zrangebyscore fan -inf inf1) "jin"2) "zhao"3) "zhang"4) "wen"5) "li"127.0.0.1:6379> zrangebyscore fan -inf inf withscores 1) "jin" 2) "97" 3) "zhao" 4) "98" 5) "zhang" 6) "99" 7) "wen" 8) "100" 9) "li"10) "101"127.0.0.1:6379> zrange fan 0 -11) "jin"2) "zhao"3) "zhang"4) "wen"5) "li"127.0.0.1:6379> ## 删除 value127.0.0.1:6379> ## zrem key value127.0.0.1:6379> zrem fan wen(integer) 1127.0.0.1:6379> zrange fan 0 -11) "jin"2) "zhao"3) "zhang"4) "li"127.0.0.1:6379>
没有评论:
发表评论