文章目录

  • 入门
  • Redis 基本数据结构
    • Redis API
      • 通用API
      • strings\ hash\list\set\zset
        • Strings
        • Hash
        • List
        • Set
        • Zset
  • 应用场景
    • Strings
      • 单值缓存
      • 对象缓存
      • 分布式锁
      • 计数器
      • Web集群session共享
      • 分布式系统全局序列号
    • Hash
      • 对象缓存
      • 电商购物车
    • List
      • 常用数据结构
      • 微信-订阅号消息
    • Set
      • 点赞,收藏,标签
      • 抽奖
      • 共同关注、共同好友。。。
    • Zset
      • 热搜


入门

如果您还未接触过Redis ,请先阅读 【Redis-入门到精通】


Redis 基本数据结构

这里我们简单回顾下,记住常用的就够了,记不住的访问官方网站。

Redis API

通用API

  keys 、del 、dbsize 、expire (ttl、persist)、exists、type…….

时间复杂度都是O(1)


strings\ hash\list\set\zset

Strings

举个例子:缓存用户信息------------->将用户信息结构使用 JSON 序列化成字符串,然后将序列化后的字符串存入 Redis 来缓存。

同样的,取用户信息会经过一次反序列化的过程

Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.

如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。

当字符串长度小于 1M 时, 扩容都是加倍现有的空间。

如果超过 1M,扩容时一次只会多扩 1M 的空间。

需要注意的是字符串最大长度为 512M

SET  key  value          //存入字符串键值对
MSET  key  value [key value ...]    //批量存储字符串键值对
SETNX  key  value       //存入一个不存在的字符串键值对
GET  key            //获取一个字符串键值
MGET  key  [key ...]        //批量获取字符串键值
DEL  key  [key ...]         //删除一个键
EXPIRE  key  seconds        //设置一个键的过期时间(秒)原子加减
INCR  key           //将key中储存的数字值加1
DECR  key           //将key中储存的数字值减1
INCRBY  key  increment      //将key所储存的值加上increment
DECRBY  key  decrement  //将key所储存的值减去decrement

Hash

HSET  key  field  value          //存储一个哈希表key的键值
HSETNX  key  field  value       //存储一个不存在的哈希表key的键值
HMSET  key  field  value [field value ...]  //在一个哈希表key中存储多个键值对
HGET  key  field                //获取哈希表key对应的field键值
HMGET  key  field  [field ...]      //批量获取哈希表key中多个field键值
HDEL  key  field  [field ...]       //删除哈希表key中的field键值
HLEN  key               //返回哈希表key中field的数量
HGETALL  key                //返回哈希表key中所有的键值
HINCRBY  key  field  increment      //为哈希表key中field键的值加上增量increment

List

LPUSH  key  value [value ...]        //将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]       //将一个或多个值value插入到key列表的表尾(最右边)
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列表表尾弹出一个元素,若列表中没有元素,阻塞等待                    timeout秒,如果timeout=0,一直阻塞等待


Set

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中删除Set运算操作
SINTER  key  [key ...]              //交集运算
SINTERSTORE  destination  key  [key ..]     //将交集结果存入新集合destination中
SUNION  key  [key ..]               //并集运算
SUNIONSTORE  destination  key  [key ...]        //将并集结果存入新集合destination中
SDIFF  key  [key ...]               //差集运算
SDIFFSTORE  destination  key  [key ...]     //将差集结果存入新集合destination中

Zset

  ZSet常用操作
ZADD key score member [[score member]…] //往有序集合key中加入带分值元素
ZREM key member [member …]      //从有序集合key中删除元素
ZSCORE key member           //返回有序集合key中元素member的分值
ZINCRBY key increment member        //为有序集合key中元素member的分值加上increment
ZCARD key               //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]  //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]   //倒序获取有序集合key从start下标到stop下标的元素Zset集合操作
ZUNIONSTORE destkey numkeys key [key ...]   //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算


应用场景

Strings

单值缓存

SET  key  value
GET  key

对象缓存

1) SET  user:1  value (json格式数据)
2) MSET  user:1:name  artisan user:1:balance  1888MGET  user:1:name  user:1:balance

分布式锁

SETNX  product:10001  true       //返回1代表获取锁成功
SETNX  product:10001  true      //返回0代表获取锁失败
。。。执行业务操作
DEL  product:10001          //执行完业务释放锁
SET product:10001 true  ex  10  nx  //防止程序意外终止导致死锁

计数器

INCR article:judge:{文章id}
GET article: judge:{文章id} 

转发评论

集群环境 并发访问同一个文章 如何保证线程安全

redis单线程 原子性


Web集群session共享

spring session + redis实现session共享

spring session 本身就是使用redis作为外部存储


分布式系统全局序列号

INCRBY  orderId  1000

每次获取1000 存入内存,VS 每次都去redis取1个

N多表,N多并发 ,N多场景使用redis

节点挂了也没关系,无非就是id浪费了


Hash

对象缓存

HMSET  user  {userId}:name  artisan  {userId}:balance  1888
HMSET  user  1:name  artisan  1:balance  1888
HMGET  user  1:name  1:balance  

超时 针对key ,无法针对 field
避免 big key


电商购物车

1)以用户id为key
2)商品id为field
3)商品数量为value

• 购物车操作

  1. 添加商品hset cart:1001 10088 1
  2. 增加数量hincrby cart:1001 10088 1
  3. 商品总数hlen cart:1001
  4. 删除商品hdel cart:1001 10088
  5. 获取购物车所有商品hgetall cart:1001


List

常用数据结构

Stack(栈) = LPUSH + LPOP  FILO
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP ( 会阻塞其他消息,如果使用,使用单独的Redis)

微信-订阅号消息

比如我关注的公众号,如何显示这些公众号发送的消息?

举个例子
1)A 23:00发布公众号文章,消息ID为10018

LPUSH  msg:{我的-ID}  10018

2)B 23:05 发布公众号文章,消息ID为10086

LPUSH  msg:{我的-ID} 10086

3)C 23:30 发布公众号文章,消息ID为10099

LPUSH  msg:{我的-ID} 10099

3)查看最新的关注的公众号发布的消息

LRANGE  msg:{我的-ID}  0  5

都往我的这个队列里放, lpush 从左侧放

C的文章id B的文章id A 的文章id

获取,肯定是按照时间倒叙排

LRANGE  msg:{我的-ID}  start  stop

Set

点赞,收藏,标签

  1. 点赞
SADD  like:{消息ID}  {用户ID}
  1. 取消点赞
SREM like:{消息ID}  {用户ID}
  1. 检查用户是否点过赞
SISMEMBER  like:{消息ID}  {用户ID}
  1. 获取点赞的用户列表
SMEMBERS like:{消息ID}
  1. 获取点赞用户数
SCARD like:{消息ID}

抽奖

点击参与抽奖加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count]

一 二三等 奖 抽中的移除 SPOP


共同关注、共同好友。。。

集合操作的应用

SINTER set1 set2 set3 -> { c }
SUNION set1 set2 set3 ->  { a,b,c,d,e }
SDIFF set1 set2 set3 ->  { a }   以第一个集合为基准,减去后面的集合所有元素Abc -  bcd  cde --->  a  第一个集合不存在的不算

Zset

热搜

1)点击新闻

ZINCRBY  hotNews:20200307  1  fujian 【score加1 】

2)展示当日排行前十

ZREVRANGE  hotNews:20200307  0  10  WITHSCORES

3)七日搜索榜单计算

ZUNIONSTORE  hotNews:20200301-20200307  7
hotNews:20200301  hotNews:202000302... hotNews:202000307

4)展示七日排行前十

ZREVRANGE hotNews:20200301-20200307  0  10  WITHSCORES

Redis进阶-核心数据结构进阶实战相关推荐

  1. 01-Redis核心数据结构和高性能原理

    Redis核心数据结构和高性能原理 Redis安装 核心数据结构以及用法 String结构 字符串常用操作 原子加减 应用场景 Hash结构 Hash常用操作 Hash应用场景 Hash结构优缺点 L ...

  2. 【Caffeine进阶】Redis+Caffeine 两级缓存实战,性能爆缸

    往期回顾 博主前面发过一篇[缓存框架Caffeine]初级篇,主要介绍了Caffeine的入门级使用!地址https://blog.csdn.net/Number_oneEngineer/articl ...

  3. 前端开发核心知识进阶

    课程内容 开篇词:如何突破前端开发技术瓶颈 日本后现代主义作家村上春树写过一本富有哲理的书--<当我谈跑步时我谈些什么>. 书中,他谈到,跑步跟写作一样:都需要坚毅隐忍,追逐超越:都需要心 ...

  4. 抖音Java后端开挂,全靠这份啃了48天【Java进阶核心知识集+刷:25专题面试】

    人人都想进大厂,当然我也不例外.早在春招的时候我就有向某某某大厂投岗了不少简历,可惜了,疫情期间都是远程面试,加上那时自身也有问题,导致屡投屡败.突然也意识到自己肚子里没啥货,问个啥都是卡卡卡卡,后期 ...

  5. Redis介绍使用及进阶

    Redis介绍使用及进阶 目录: 一.介绍 二.缓存问题 三.Redis内存滥用 四.键命名规范 五.Redis使用场景 六.持久化操作 七..Net Core 使用redis 简单介绍 一.介绍 1 ...

  6. Apollo进阶课程㊸丨Apollo实战——障碍物感知和路径规划能力实战

    原文链接;进阶课程㊸丨Apollo实战--障碍物感知和路径规划能力实战 环境感知在自动驾驶汽车应用中占据了核心地位.一辆车要实现自动驾驶,障碍物感知是最基础也是最核心的功能. 上周阿波君为大家详细介绍 ...

  7. Apollo进阶课程㊷丨Apollo实战——车辆与循迹驾驶能力实战

    原文链接:进阶课程㊷丨Apollo实战--车辆与循迹驾驶能力实战 循迹自动驾驶是指让车辆按照录制好的轨迹线进行自动驾驶,其涉及到自动驾驶中最基本的底盘线控能力.定位能力.控制能力,是自动驾驶系统的一个 ...

  8. Apollo进阶课程㊶丨Apollo实战——本机演示实战

    原文链接:进阶课程㊶丨Apollo实战--本机演示实战 Apollo是一个开放的.完整的.安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统. 上 ...

  9. Spring Boot进阶:原理、实战与面试题分析

    在当下的互联网应用中,业务体系日益复杂,业务功能也在不断地变化.以典型的电商类应用为例,其背后的业务功能复杂度以及快速迭代要求的开发速度,与5年前的同类业务系统相比,面临着诸多新的挑战. 这些挑战中核 ...

最新文章

  1. js layui 模板属性 添加_layui.laytpl--模板引擎文档
  2. 网络数据包信息收集工具ferret-sidejack
  3. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
  4. duration java_Java Duration类| minusMillis()方法与示例
  5. 告别只会调参和调包,全球顶会论文审稿人带你7天玩转图像分割
  6. 鼠标hover表格头部信息出现闪烁
  7. 【路径规划】基于matlab GUI D_star算法最短路径规划【含Matlab源码 634期】
  8. html写手机登录界面,使用HTML做手机端的登录界面
  9. 分布式定时任务的解决方案
  10. 搜狗批量提交软件-批量提交网站链接
  11. 什么是PPI,有什么作用?
  12. 小米2/2S刷基于Android 5.1.1的CM12.1系统教程
  13. 使用GoldenGate完成MySQL到MySQL的同步
  14. 小米、街电、携程等名企找人了,免费内推
  15. 【Python从零到壹】Python文件的操作详解
  16. 抖音搬运视频热门技巧 剪辑后会修改视频md5
  17. element中切换时间日期选择器时下拉框偏移到左上角的问题
  18. 鞋底php是什么材质,鞋底用EVA材料更好还是橡胶呢?
  19. 小程序云开发,CMS内容管理系统
  20. 从业务架构师角度看区块链为什么以及如何改变世界

热门文章

  1. html js 做的小游戏,用js做一个小游戏平台 (一)
  2. IntelliLight: a Reinforcement Learning Approach for Intelligent Traffic Light Control 论文阅读
  3. 动态规划-背包问题小结
  4. 57. Leetcode 257. 二叉树的所有路径 (二叉树-二叉树路径和)
  5. 文巾解题 面试题 17.10. 主要元素
  6. R语言实战应用精讲50篇(十九)-R语言gganimate函数应用案例:静态图变成动态,让你的图表更酷炫
  7. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)
  8. 科技在进步,一文带你看看 MATLAB R2020a 为工程师和科学家带来哪些 AI 功能?
  9. 基于 Kafka 与 Debezium 构建实时数据同步
  10. MATLAB基本操作(七):有关文件路径的几个函数在编程中的作用