redis五种类型的经典使用场景
highlight: androidstudio
说明:
对于redis命令这里不在赘述 直接戳这里 redis命令手册 或者 这个也是命令手册 都可以
另外其原生命令和 RedisTemplate中的方法对应请戳这里 github 里边有具体的示例
String
这货是我们平时开发中用的比较多的,也是最简单的一种
1. 设置开关,标识 (配合nacos配置中心真的挺香的~~~)
2. 共享session如token 以及 incr操作
3. 将对象转为json串后(value为String)设置进redis
但是这样做有个很明显的缺点就是如果你要修改对象的某一个字段,也得把整个对象的json串拿出来反序列化成对象,这样做得话有点不值得。
那么我们如何优化一下呢?
其实可以使用mset命令 如下
MSET key1 "Hello" key2 "World"
- 代码如下
- but 这种的话,适用于字段较少 且存在频繁修改少量字段的情况下,否则没必要,直接转成json存进去就完事了。
4. 分布式锁
在之前的版本中 nx和ex不是原子的,后来才开始支持的。
set userId:101 lock ex 100 nx
在代码中我们可以这么做(只是演示哈,实际中推荐使用redisson 或者你自己造个轮子大家都认可的话也可以)
```java protected ValueOperations string;
//setnex Boolean nex = string.setIfPresent("setnex:key", "value",10,TimeUnit.SECONDS); System.out.println(nex); ```
当然关于分布式锁我也将会写一篇文章,我想的是仿照 Redisson 手写个,但是实际使用中我还是使用Redisson,因为其真的很强。 Redisson的github地址 其内部使用了netty,源码也相对简单是个很好的redis客户端。
List
基于List结构 我可以实现栈,队列,阻塞队列
Stack
(栈) = LPUSH + LPOP ,FILO先入后出 结合LPUSH和LPOP命令实现栈的先进后出的特性,LPUSH从左边入栈,LPOP从左边出栈,先进入 的 后出来。相当于入口出口是一个。
Queue
(队列)= LPUSH + RPOP,FIFO先进先出 结合LPUSH和RPOP命令实现队列的先进先出的特性,LPUSH从左边入队,RPOP从右边出队,先进来的先出来。相当于入口出口各在两边。
Blocking Queue
(阻塞队列)= LPUSH + BRPOP 结合LPUSH和BRPOP实现阻塞队列,BRPOP比RPOP多了一个timeout的参数,是一个等待的最大时间,如果在这个时间内拿不到数据则返回空。
- 还可以用它来做分页(如文章列表),以用户id为key 文章id+标题+文章(组装成对象)为value(当然肯定不是文章内容那样的话太占空间了,具体的文章内容需要点进去时候,才去加载),发表文章时候lpush,做查询时候 range(pageNum,pageSize)取出即可效率很高 (当然这么做需要根据实际情况去衡量是否合理)。
- 热点数据,在实际场景我们也这么用过,其实和第4点类似,只不过不存所有的数据,只往list放热点数据罢了。
Hash
使用hash用来存储对象也是比较合适的
其数据结构是和java中的hash一样的。但我记得有个区别是他的扩容(渐进式的 具体见黄建宏大佬的《redis设计与实现》书中有写)和java中的不一样。
下图中将对象存进hash结构中(注意: HK对应的值我在getObjectToMap方法中拼接了id以防止重复)
为什么我们叫它HK ?
源于下边代码(我觉得比较合适所以这里就称为HK了) ``` public interface HashOperations{
void putAll(H var1, Map extends HK, ? extends HV> var2);
} ```
我们发现使用String和hash都可以存对象,那什么时候用String什么时候用hash呢
适合用 String 存储的情况:
- 每次需要访问大量的字段 (这时序列化的成本就没那么不值得了)
- 存储的结构具有多层嵌套的时候 (hash对这种情况基本上很难处理)
适合用 Hash 存储的情况:
- 在大多数情况中只需要访问少量字段 O(1)
关于hash 有个地方提一下
过期功能不能使用在HK上,只能用在key上
另外电商中的购物车功能也可以用此结构
1.以用户id为key,商品id为(HK),商品数量为value(HV)可以实现购物车的常规操作
如下图:
Set
点赞
- 点赞 点赞就把点赞这个人的ID加到这个点赞的集合中
SADD like:{消息ID} {用户ID}
- 点赞 点赞就把点赞这个人的ID加到这个点赞的集合中
- 取消点赞 从集合中移除用户ID
SREM like:{消息ID} {用户ID}
- 取消点赞 从集合中移除用户ID
- 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
- 检查用户是否点过赞
4.获取点赞的用户列表
SMEMBERS like:{消息ID}
- 获取点赞用户数
SCARD like:{消息ID}
当然像这种场景的话,还有更好的实现方式就是redis的BitMap
,用他来记录这种true or false的场景简直不要太爽,当然这个的话必须要好好设计下key,以便在统计时候好操作。(顺便说一下他也有缺点的哦) 关于bitMap我后续也会写一篇文章来说明。
共同关注、可能认识的朋友,你关注的xxx是否也关注了yyy
看下图 可能认识的人 一般都有个来自什么什么
共同关注和我关注的xxx也关注了yyy这样的我在我手机中没找到,等哪天找到了在更新下吧。
ZSet
最经典的 微博的热搜排行榜
在有京东的热搜
。。。。各种热搜,或者什么排行榜等等;当需要以某某系数为权重进行排行的时候,就可以考虑使用ZSet了 ps:(其实ZSet对比set,就是多了一个按分值排序的功能)
除此之外什么点赞排行榜,评论排行榜等等也都可以考虑使用它;
- 1 点击新闻
每次有人点击这个新闻,那么就给该条新闻的分值加1
ZINCRBY 热搜:20210826 1 A条新闻ID
- 2 展示当日排行前十
取集合中的前10个元素
ZREVRANGE 热搜:20210826 0 10 WITHSCORES
- 3 近四天热点榜单计算
``` 由于该命令不常用这里贴出语法 : ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZUNIONSTORE 近4天热搜计算2 4 热搜:20210823 热搜:20210824 热搜:20210825 热搜:20210826 AGGREGATE SUM ```
- 4 展示近4日排行前十
ZREVRANGE 近4天热搜计算2 0 10 WITHSCORES
-----------------------------------华丽的分割线------------------------------------
下面我们把以上操作演示一下
现在我们为23,24,25 这几天也增加点数据后使用将这4天的sum起来并存储到新key(近4天热搜计算2)中其分组条件就是 key; 即以 (热搜:20210823 热搜:20210824 热搜:20210825 热搜:20210826 ) 这些作为分组条件
ZUNIONSTORE 近4天热搜计算2 4 热搜:20210823 热搜:20210824 热搜:20210825 热搜:20210826 AGGREGATE SUM
看下新key中的内容
展示近4日排行前十
根据分值倒叙排序(他默认是正序的,想最大的在前那就肯定需要倒叙排序了)
ok就先到这里吧明天肝一篇缓存和bitmap的文章
redis五种类型的经典使用场景相关推荐
- Redis五种类型的常用操作
Redis常用操作 String类型(字符串) 创建一个字符串 set 键 值 获取字符串的值 get 键 追加值 append 键 值 修改值 set 键 新值 设置键值及过期时间,以秒为单位 se ...
- Redis五种数据结构及其使用场景
Redis五种数据结构及其使用场景 先有个概念,redis 数据库其实就是一个大的 map,它容纳了所有的 key, key 都是 string 类型,而 value 则有 string, list, ...
- redis五种数据类型的应用场景_Redis五种不同的数据类型
一.redis集群测试环境搭建 参考文章:https://www.jianshu.com/p/0a2f8f80983a redis-cli -c -h 10.96.87.129 -p 7001注意:- ...
- Redis五种数据类型及应用场景
Redis五种数据类型及应用场景 MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样 ...
- redis五种数据类型及使用场景
Redis 数据类型 转载自https://blog.csdn.net/zzu_seu/article/details/106323114 五种类型与类比java的模型 string --> S ...
- Redis五种数据类型应用场景详解(超级详细版)
目录 NoSQL:一类新出现的数据库(not only sql) 特征 NoSQL和SQL数据库的比较: 电商场景解决方案 Redis简介 Redis特性 Redis 优势 Redis应用场景 官方文 ...
- Redis五种数据结构应用场景
文章目录 前言 二.字符串String 2.1.常用操作 2.2.应用场景 2.2.1.单值缓存(最常用) 2.2.2.对象缓存 2.2.3.分布式锁 2.2.4.计数器 三.哈希hash 3.1.常 ...
- redis五种数据类型的使用场景
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis五种数据结构
对redis来说,所有的key(键)都是字符串,所谓的5种数据结构是指针对value而言 1.Redis五种数据结构如下: 数据结构类型 说明 使用场景 常用方法 其他链接 String字符串类型 1 ...
最新文章
- 关于Spark NLP学习,你需要掌握的LightPipeline(附代码)| CSDN博文精选
- 科普:5G网络关键技术详解
- 非root用户挂载NFS
- IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
- 2019五个最棒的机器学习课程
- 通俗的解释交叉熵与相对熵
- Jquery表单验证 只能输入数字,
- python3字典列表_python3_列表、元组、集合、字典
- linux gvim字体大小配置,Gvim 字体大小设置
- 【SQL基础】SQL查询语句实例
- 9700usb网卡 linux驱动,qf9700 USB网卡在x86 linux和arm linux上的驱动安装以及配置
- python小游戏:剪刀,石头,布
- 100兆宽带下载速度为什么没有100兆/秒
- 2021年焊工(初级)试题及解析及焊工(初级)实操考试视频
- sangerbox平台使用(五)venn图的绘制
- 启动定时器t0的工作指令是_80c51单片机定时器t0工作于方式1定时时间1ms当晶振为6mhz时求计数初值为多少...
- 产业扶贫莫要停留在口号,看每日一淘如何打动山里人的心
- RT-Thread柿饼控件(1)-- AnimatedImage
- QString自动补全
- Gensim官方教程翻译(五)——英文维基百科的实验