分布式--redis基本数据结构及使用

redis常用5种数据结构

比较常用的5种数据结构

字符串常用操作

//查看帮助 
help @string
set key value //存入字符串键值对
get key          //获取对应key的值
mset key value[key1 var2 key2 var2] //批量存储
mget key key1 key2 //批量获取对应的值
setnx key value  //存入一个不存在的字符串键值对 已存在则不保存 不存在新增
del key [key1 key2] //删除一个或多个键
expire key seconds  //设置一个建的过期时间

//原子加减
incr key  //将key中存储的数值加1 只能对数值型操作 不存在这个键则默认算0开始,加完之后就是1
decr key //将key中存储的数值减1 只能对数值型操作 不存在这个键则默认算0开始,加完之后就是-1
incrby key increment  //将key中存储的数值增加 increment(指定数值)
decrby key decrement  //将key中存储的数值减去 increment(指定数值)

字符串使用场景

(1)单值缓存(session共享等)
set key value
get key
(2)对象缓存
//比如说对一个对象操作比较频繁的时候
//就可以用这个方式,不需要频繁将对象转json存到redis中在将对象从redis中拿出来在转json操作
mset obj:id:name  xxx  obj:id:age yy  //[obj:id:name]只是key的别名,规范看个人
mget obj:id:name obj:id:age  //xxx yy 可以批量获取也可以单个获取,可以同时修改也可以局部修改
(3)简单的分布式锁
setnx product:10001 true //返回1表示获取成功
setnx product:10001 true //返回0表示获取成功
....执行业务逻辑
del product:10001 //释放锁
//仅仅只是简单思路,分布式锁实现比这个复杂多了
set product:10001 true ex 10 nx //防止程序以外中止导致死锁
(4)计数器
类似阅读量需要累加计数使用的
incr article:readcount:{文章id}  //点一下新增一
get article:readcount:{文章id} //获取这篇文章阅读量
(5)全局唯一序列号
incrby orderid 1000 
//一次性新增1000的值,可以将这个值存在服务器内存中,本地获取,
//多台服务器类似操作,自己机器值用完再去获取,可以提高redis性能,
//不适应需要递增序列号的使用

hash结构常用操作

//查看帮助 
help @hash
hset key field value //存储一个哈希表key的键值  可以简单看成key key value的结构
hget key field //获取哈希表key对应的field值
hmset key field value [field1 value1 field2 value1]   //在一个哈希表key中存多个键值
hmget key field [field1 field2]  //获取哈希表key中存在的多个field的值
hsetnx key field value //存储一个不存在哈希表的key键值
hdel key field [field1 field2] //删除对应的哈希表key中指定的field值
hlen key //返回哈希表中key对应的field的数量
hgetall key //返回哈希表中key对应的所有键值
hincrby key field increment //往哈希表中key对应的field的值增加指定的increment

hash结构的使用场景

(1)对象缓存
//表示在key为user的哈希表中存在一个或多个指定用户id的用户基础数据
hmset user {userId}:name 张三 {userId}:age  18 [field1 value1 field2 value2] 
hmset user 1:name 李四  1:age18   2:name 老王  2:age  20
//获取一个或多个指定key中的某个field字段值
hmget user {userId}:name {userId}:age
(2)购物车
//设计以用户id作为key 商品id为field 商品数量为value
//购物车操作
(1) 添加商品 hmset cart:1001 product:10001 1 //用户id为1001的用户添加了一个商品id为10001的商品
(2) 增加数量 hincrby cart:1001 product:10001 1 //给这个商品多添加一个商品(原子操作)
(3) 商品总数 hlen cart:1001 //获取这个id为1001用户所有的商品数量
(4) 删除商品 hdel cart:1001 product:10001  //删除购物车中,指定的10001这个商品
(5) 获取购物车所有的商品 hgetall cart:1001 //获取购物车所有商品
hash结构的优缺点
优点
(1) 同类数据,归类整合存储,方便数据管理,可以针对性的对field执行操作
(2) 相比spring存储更加节省空间
(3) 相比spring操作使用消耗内存与cpu更少
缺点
(1) 过期功能不能争对key中的field使用,存在局限性
(2) 集群环境不适合大规模使用,因为redis的数据是在集群中是分机器保存的,
如果一个使用很频繁的key存在某个机器中会加大这个机器的负担
官方也不推荐bigkey(大key)

在这里插入图片描述

上面是个集群架构图

List结构常用操作

//查看帮助 
help @list
LPUSH key value[value1 value2 ..]  //往指定key的list的左侧存放元素
RPUSH key value [value1 value2 ..]  //往指定key的list的右侧存放元素
LPOP key  //移除并返回list的左侧第一个元素
RPOP key //移除并返回list的右侧第一个元素
LRANGE key start stop //返回list列表在start与stop区间的元素,0开始
//可以看成将一个或多个集合组合而成的一个集合 从头部获取移除并获取第一个值
//如果没用值则阻塞在这里,等待timeout超时返回
BLPOP key [key1 key2 ...] timeout 
BRPOP key [key1 key2 ...] timeout //同理

List结构应用场景

(1) 可建造常用数据结构
Stack(栈) =  LPUSH + LPOP //先进后出
Queue(队列) = LPUSH + RPOP //先进先出
Blocking MQ(阻塞队列) = LPUSH + BRPOP //无数据超时阻塞
(2) 订阅消息
//比如我关注了某人
//某人发了一条消息id为10008的消息
LPUSH msg:{userId} 10008 //userId作为我的身份id,10008是消息的id
//其他人也关注了同时也收到消息
LPUSH msg:1002 10008 
//查看某人最新的5条消息
LRANGE msg:1002 0 4

Set结构常用操作(不重复)

set基本使用
//查看帮助 
help @set
//往集合key中存放元素,元素存在则忽略,key不存则新增
SADD key member [member1 member2 ..] 
//删除key中指定的元素
SREM key member [member1 member2 ..] 
//获取集合key中所有元素
SMEMBERS key
//获取集合key中所有元素个数
SCARD key
//判断key中是否存在元素member
SISMEMBER key member
//从集合key中取出count个元素,不做删除(随机)
SRANDMEMBER key count
//从集合key中取出count个元素,将取出的元素从集合中删除(随机)
SPOP key count
set集合运算
//交集运算,把key,key1,key2计算返回交集集合
SINTER key [key1 key2]
//将key key1 key2集合交集运算的结果数据合并到distination集合中
SINTERSTORE destination key [key1 key2 ...]
//并集运算,计算key key1 key2 计算返回并集集合
SUNION key [key1 key2 ..]
//将key key1 key2集合并集运算的结果数据合并到distination集合中
SUNIONSTORE destination   key [key1 key2 ...]
//差集运算,计算key key1 key2 计算返回差集集合
SDIFF key [key1 key2 ..]
//将key key1 key2集合差集运算的结果数据合并到distination集合中
SDIFFSTORE  destination   key [key1 key2 ...]

set结构应用场景

(1)抽奖
//将需要抽奖的用户放入集合中
SADD key {userId,userId2}
//查看参与抽奖的所有用户
SMEMBERS key
//抽取count名中奖者,移除集合/不移除集合
SRANDMEMBER key [count] /SPOP key [count]
(2) 点赞等
//点赞
SADD {消息id} {用户id}
//取消点赞
SREM {消息id} {用户id}
//检查用户是否点过赞
SISMEMBER {消息id} {用户id}
//获取用户点赞列表
SMEMBERS {消息id}
//获取点赞用户数
SCARD {消息id}
(3)社交模型(通过set的交集并集差集来设计)
SADD ASET {B C D} //A 关注了 B C D
SADD BSET {A D F} //B 关注了 A D F
SADD CSET [B D E F G H]  //C关注了 B D E F G H
//A和B共同关注了
SINTER ASET BSET ⇒ D
//这个时候A进到C的主页,C列表那边需要体现一个A关注的人也关注了他,并且展示出来
SISMEMBER BSET C //A关注了C,所以在B的集合中判断是否存在C就可以知道A关注的B是否也关注了C,结果是B并没有关注C
SISMEMBER DSET C //同理
//A可能认识的人 在C的主页中(差集计算)
SDIFF CSET ASET ==> {C E F G H}
(4) 商品的筛选(同理,使用交集计算)
SADD 手机品牌 华为 小米 三星 苹果
SADD 国产 华为 小米
SADD 内存8g 华为 小米 三星
SADD 内存4g 华为 小米 三星 pingg
//筛选内存8g的国产手机
SINTER 内存8g 国产 ==> 华为 三星

ZSET结构常用操作(不重复,有序)

ZSET 常用操作
//查看帮助 
help @sorted_set
 ZADD key score member [score member ...]  //往有序集合key中带入加分值的元素
 ZREM key member [member ...] //从已排序的集合中移除一个或多个成员
 ZSCORE key member //获取排序集中与给定member相关的分值
 ZINCRBY key increment member //为有序集合中指定的member加上对应的increment值
 ZCARD key //返回有序集合key的元素个数
 ZRANGE key start stop [WITHSCORES]  //正序获取有序集合key中的指定下标元素[WITHSCORES]表示是否同时查出对应分值
 ZREVRANGE key start stop [WITHSCORES]   //倒序获取有序集合key中的指定下标元素[WITHSCORES]同上
ZSET集合运算
//并集计算(将多个key集合合并未一个新的destination numkeys表示需要合并key的数量)
 ZUNIONSTORE destination numkeys key [key ...] 
//交集计算(将多个key集合合并未一个新的destination numkeys表示需要合并key的数量)
 ZINTERSTORE destination numkeys key [key ...] 

ZSET结构应用场景

排行榜
//点击文章
ZINCRBY hotNews:20201114  1  {文章id} //点击一次指定的文章阅读量加一
//展示当日排行榜前十
ZREVRANGE hotNews:20201114 0 9 WITHSCORES //倒序展示baok点击量最多的十篇文章,包括点击量
//七日搜索榜单计算(将七天集合整合起来)
ZUNIONSTORE hotNews:20201107 - 20201114 7 hotNews:20201107 hotNews:20201108 ... hotNews:20201114
//展示七日排行榜前十
ZREVRANGE hotNews:20201107 - 20201114 0 9 WITHSCORES

Redis客户端命令对应的RedisTemplate中的方法列表:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值