Redis详解【安装及常用数据结构】
安装
要学习redis当然要先安装了,在linux系统中
- https://github.com/redis/redis-hashes/?tab=readme-ov-file ,这里是Redis各个版本的下载地址,我下的是5.0.3的版本
- 把下载好的安装包放在 /usr/local文件夹下
- tar -zxvf redis-5.0.3.tar.gz
- cd redis-5.0.3
- make (进入到解压好的redis-5.0.0目录下,进行编译与安装)
- 启动并指定配置文件: src/redis-server redis.conf (使用后台启动,把redis.conf里的daemonize改为yes)
- 验证:ps -ef | grep redis
- 进入客户端:src/redis-cli
- 退出客户端:exit
常用数据结构
建议去看官方文档
String应用场景
单值缓存
set key value
get key
对象缓存
set user:1 value(json格式数据)
mset user:1 name hangker user:1:balance 1888
mget user1:name user:1:balance
分布式锁
setnx product:10001 true //返回1代表获取锁成功0代表失败
del product:10001 //执行完业务释放锁
set product:10001 true ex 10 nx //防止程序意外终止导致死锁
计数器
incr article:readcount:{文章id}
get article:readcount:{文章id}
Web集群session共享
spring session+ redis实现session共享
分布式系统全局序列号
incrby orderid 1000 //redis批量生成序列号提升性能
HASH应用场景
对象缓存
hmset user {userID}:name hangker {userID}:balance 1888
hmset user 1:name hangker 1:balance 1888
hmget user 1:name 1:balance
电商购物车
以用户id为key,商品id为field,商品数量为value
购物车操作
- 添加商品->hset cart:101 10088 1
- 增加数量->hincrby cart:101 10088 1
- 商品总数->hlen cart:101
- 删除商品->hdel crt:101 10088
- 获取购物车所有商品->hgetall cart:101
Hash结构优缺点
优点:
- 同类数据归类整合储存,方便数据管理
- 相比string操作消耗内存与cpu更小
- 相比string储存更节省空间
缺点:
- 过期功能不能使用在field上,只能用在key上
- Redis集群架构下不适合大规模使用
List
常用操作
- LPUSH KEY VALUE[VALUE…] //将一个或者多个值value插入到key列表的表头(最左边)
- RPUSH key value[value…] //将一个或者多个值value插入到列表的表尾(最右边)
- LPOP key //移除并返回key列表的头元素
- RPOP key //移除并返回key列表的尾元素
- LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
- BLPOP key [key…] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
- BRPOP key [key…] timeout //从key列表表尾弹出一个元素…
常用数据结构
- Stack(栈)=LPUSH+LPOP=FILO
- Queue(队列)=LPUSH+RPOP
- Blocking MQ(阻塞队列)=LPUSH+BRPOP
应用场景
微博消息和微信公众号消息
我关注了虎哥说车、可伶贝尔等大v
- 虎哥说车发微博,消息id为10018
LPUSH msg:{hangker-id} 10018
- 可怜贝尔发微博,消息id为10086
LPUSH msg:{hangker-id} 10086
- 查看最新微博消息
LRANGE msg:{hangker-id} 0 4
Set
常用操作
- SADD key member [member …] //往集合key中存入元素,元素存在则忽略,若key不存在则新建
- SREM key member [member …] //从集合key中删除元素
- SMEMBERS key //获取集合key中所有元素
- SCARD key //获取集合key的元素个数
- SISMEMBER key member //判断member元素是否存在于集合key中
- SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除
- SPOP key [count] //从集合key中选出count个元素,元素从key中删除
运算操作
- SINTER key [key…] //交集运算
- SINTERSTORE destination key [key…] //将交集结果存入到新集合destination中
- SUNION key [key…] //并集运算
- SUNIONSTORE destination key [key…] //将并集结果存入到新集合destination中
- SDIFF key [key…] //差集运算
- SDIFFSTORE destination key [key…] //将差集结果存入到新集合destination中
应用场景
微信抽奖小程序
- 点击参与抽奖加入集合 SADD key {userID}
- 查看参与抽奖所有用户 SMEMBERS key
- 抽取count名中奖者
- SRANDMEMBER key [count]
- SPOP key [count]
微信微博点赞,收藏,标签
- 点赞
SADD like:{消息id} {用户id} - 取消点赞
SREM like:{消息id} {用户id} - 检查用户是否点过赞
SISMEMBER like:{消息id} {用户id} - 获取点赞的用户列表
SMEMBERS like:{消息id} - 获取点赞用户数
SCARD like:{消息id}
集合操作实现微博微信关注模型
- hangker关注的人:
hangkerSet –> {guojia,xushu}
- 杨过老师关注的人:
yangguoSet–> {hangker,baiqi,guojia,xushu}
- 郭嘉老师关注的人:
guojiaSet–>{hangker,yangguo,baiqi,xushu,xunyu}
- hangker和杨过老师的共同关注:
SINTER hangkerSet yangguoSet–>{guojia,xushu}
- hangker关注的人也关注他(杨过)
SISMEMBER guojiaSet yangguo
SISMEMBER xushuSet yangguo
- 我可能认识的人
SDIFF yangguoSet hangkerSet –> {hangker,baiqi}
集合操作实现电商商品筛选
SADD brand:huawei P40
SADD brand:xiaomi mi-10
SADD brand:iPhone iphone12
SADD os:android p40 mi-10
SADD cpu:brand:intel P40 mi-10
SADD ram:8G P40 mi-12 iphone12
SINTER os:android cpu:brand:intel ram:8g–>{P40,mi-10}
ZSet
常用操作
- ZADD key score member [[score member]…] //往有序集和key中加入带分值元素
- ZREM key member [member …] //从有序集合key中删除元素
- ZSCORE key member //返回有序集合key中元素member的分值
- ZINCRBY key increment member //为有序集合key中元素member的分值加上incerment
- ZCARD key //返回有序集合key中元素个数
- ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
- ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
计算操作
- ZUNIONSTORE destkey numkeys key [key …] //并集计算
- ZINTERSTORE destkey numkeys key [key …] //交集计算
应用场景
排行榜实现
- 点击新闻
ZINCRBY hotNews:20240314 1 武统台湾
- 展示当日排行榜前十
ZREVRANGE hotNews:20240314 0 9 WITHSCORES
- 七日搜索榜单计算
ZUNIONSTORE hotNews:20240317-20240324 7 hotNews:20240317 hotNews:20240318…hotNews:20240324
- 展示七日排行榜前十
ZREVRANGE hotNews:20240317-20240324 0 9 WITHSCORES