首页 > 数据库 >Redis基础知识(学习笔记1--五种基础数据结构)

Redis基础知识(学习笔记1--五种基础数据结构)

时间:2024-10-26 08:47:10浏览次数:8  
标签:... -- 元素 Redis value 键值 key 集合 数据结构

Redis,Remote Dictionary Server,远程字典服务。

Redis的性能极高:其读的速度可以达到11W/s,写的速度可以到达8W/s。高性能的原因(1)操作在内存中发生;(2)C语言开发;(3)源码简单精细(集性能与优雅于一身),早期版本源码只有2W行左右,从3.0版本(开始支持cluster),代码变成了5W左右。

Redis 有5种基础数据结构,分别为string(字符串)、list(列表)、hash(字典)、set(集合)和zset(有序集合)。

1 String 结构

1.1 字符串常用操作

复制代码

SET key value                    //存入字符串键值对
MSET key value [key value...]    //批量存储字符串键值对
SETNX key value                  //存入一个不存在的字符串键值对,如果已将存在,则set创建不成功,原来的值不变。
GET key                          //获取一个字符串键值
MGET key [key...]                //批量获取字符串键值
DEL key [key...]                 //删除一个健
EXPIRE key seconds               //设置一个健的过期时间(秒)

复制代码

1.2 原子操作
INCR key                       //将key所存储的数字值加1--value值需要是整数,它的范围在signed long 的最大值和最小值之间,超出范围,会报错。
DECR key                       //将key所存储的数字值减1
INCRBY key increment           //将key所存储的值加上increment
DECRby key decrement           //将key所存储的值减去decrement

 2. String 应用场景

2.1 单值缓存
SET key value
GET key
2.2 对象缓存
SET user:1 value(json格式数据)
2.3 分布式锁
SETNX product:10001 true            //返回1代表获取锁成功
SETNX product:10001 true           //返回0代表获取锁失败
...执行业务操作
DEL product:10001                  //执行完业务释放锁
SET product:10001 true ex 10 nx    //防止程序意外终止导致死锁
2.4 计数器
INCR article:readcount:{文章id}
GET  article:readcount:{文章id}
2.5 分布式系统全局序列号
INCRBY orderId 100   //redis批量生成序列号提升性能

3. Hash 结构

Redis的hash相当于Java里面的HashMap,它是无序字典,内部存储了很多键值对。

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

复制代码

当hash移除了最后一个元素之后,该数据结构被自动删除,内存数据被回收。

4 Hash 应用场景

4.1 对象缓存

hash 结构可以用来存储用户信息,与字符串需要一次性全部序列化整个对象不同,hash可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时,可以进行部分获取。

// 例如记录员工的信息(userid、username、balance)
HMSET user {userid}:name xiaoming {userid}:balance 30000
HMSET user 1:name xiaoming 1:balance 30000
HMGET user 1:name 1:balance

 4.2 电商购物车

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

购物车操作(假设此时用户的id为1001;商品id为10088)

1)添加商品--> hset cart:1001 10088 1

2)增加数量-->hincrby cart:1001

3) 商品总数-->hlen cart:1001

4)删除商品-->hdel cart:1001 10088

5)获取购物车所有商品-->hgetall cart:1001

5.List 结构

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,一直阻塞等待

复制代码

 List 是链表而不是数组。这意味着list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。

当列表弹出了最后一个元素之后,该数据结构被自动删除,内存数据被回收。

6 List应用场景

列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串,塞进Redis列表,另一个线程从这个列表种轮询数据进行处理。

6.1 常用分布式数据结构

队列是 先进先出 的数据结构,常用于消息排队和异步逻辑处理,它会确保元素的访问顺序。

Queue(队列) = LPUSH + RPOP

栈是 先进后出 的数据结构,跟队列正好相反。

Stack(栈) = LPUSH + LPOP

Blocking MQ(阻塞队列) = LPUSH + BRPOP

6.2 微博和微信公众号消息流

 假如小明关注了Caoz,疯狂赛车等大V

1)Caoz发微博,消息ID为10018

LPUSH msg:{小明-id} 10018

2)疯狂赛车发微博,消息ID为10086

LPUSH msg:{小明-id} 10086

3)显示最新的5条微博消息

LRANGE msg:{小明-id} 0 4

7 Set 结构

set 相当于Java里面的HashSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。

当集合中最后一个元素被移除后,数据结构被自动删除,内存被回收。

7.1 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中删除

复制代码

7.2 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中

复制代码

 8. Set 应用场景

8.1 微信抽奖小程序

1)点击参加抽奖进入集合

SADD key {userID}   ----注意:此时key应替换为抽奖活动的ID

2)查看参与抽奖所有用户

SMEMBERS key

3)抽取count名中奖者

SRANDMEMBER key [count] /SPOP key [count] 

8.2 微信微博点赞,收藏,标签

1)点赞

SADD like:{消息ID} {用户ID}

2)取消点赞

SREM  like:{消息ID} {用户ID}

3)检查用户是否点过赞

SISMEMBER  like:{消息ID} {用户ID}

4)获取点赞的用户列表

SMEMBERS like:{消息ID}

5)获取点赞用户数

SCARD  like:{消息ID}

 8.3 通过集合操作 实现微博微信关注模型

1)诸葛老师关注的人:

zhugeSet-->{zhuangzhou,xushu}

2)楼兰老师关注的人:

loulanSet-->{zhuge,zhouyu,zhuangzhou,xushu}

3)庄周老师关注的人:

zhuangzhouSet-->{zhuge,loulan,zhouyu,xushu,xunyu}

4)诸葛老师和楼兰老师共同关注:

SINTER zhugeSet loulanSet -->{zhuanzhou,xushu}

5)我【诸葛老师】关注的人也关注他(楼兰老师):【解析:我关注的就两个人嘛 ,即zhuangzhou和xushu,那就去这两个人的集合中,去判断元素是否存在集合中呗】

SISMEMBER zhuangzhouSet loulan

SISMEMBER xushuSet loulan

6)我可能认识的人:

SDIFF loulanSet zhugeSet-->{zhuge,zhouyu}

9 ZSet 有序集合结构

zset 类似于Java中的SortedSet 和 HashMap的结合体,一方面它是一个set,保证了内部value的唯一性,另一方面,它可以给每个value赋予一个score,代表这个value的排序权重。

9.1 ZSet 常用操作

复制代码

ZADD key score member [[score member]...]     //往有序集合key中加入带分值元素
ZREM key member [member...]                   //从有序集合key中删除元素
ZSCORE key member                             //返回有序集合key中元素member的分值
ZINCBY 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下标的元素

复制代码

9.2 ZSet集合操作
ZUNIONSTORE destkey numkeys key [key]  //并集计算
ZINTERSTORE destkey numkeys key [key]  //交集计算

zset中最后一个value被移除后,数据结构被自动删除,内存被回收。

 10 ZSet 集合操作实现排行榜

1)点击新闻

ZINCRBY hotNews:20200819 1 XX发布会

2)展示当日排行前十

ZREVRANGE hotNews:20200819 0 9 WITHSCORES

3)七日搜索榜单计算

ZUNIONSTORE hotNews:20200813-20200819 7 hotNews:20200813 hotNews:20200814...hotNews:20200819

4)展示七日排行前十

ZREVRANGE hotNews:20200813-20200819 0 9 WITHSCORES

 11  结构总结

如果想查看key的结构类型,执行下面的命令

type keyname

如果想查看key的存储类型,例如,我知道了key是zset类型,但是我想知道它的存储类型,是压缩列表(ziplist),还是跳跃列表(skiplist),

可以执行下面的命令,进行查看

object encoding keyname

12 容器类型数据结构的通用规则

list、set、hash、zset 这四种数据结构都是容器类型数据结构,他们共享下面两条通用规则

1)create if not exists

如果容器不存在,就创建一个,再进行操作。

比如rpush操作刚开始是没有列表的,Redis就会自动创建一个,然后再rpush进去新元素。

2)drop if not elements

如果容器里的元素没有了,那么立即删除容器,释放内存。这意味着lpop操作到最后一个元素,列表就消失了。

13.Redis安装补充说明

由于Redis是由C/C++语言编写的,而从官网下载的Redis安装包是需要编译后才可安装,所以对其进行编译就必须使用相关编译器。对于C/C++语言的编译器,使用最多的就是gcc 与 gcc-c++,而这两款编译器在CentOS 7中是没有安装的,所以首先需要安装这两款编译器。

yum -y install gcc gcc-c++

GCC,GNU Compiler Collection, GUN 编译器集合。

14 如何将SpringBoot与Redis整合?

(1)在POM中导入依赖;
(2)在配置文件中注册Redis连接信息与缓存信息;
(3)需要缓存到Redis中的实体类必须要序列化;
(4)Spring Boot启动类中要添加@EnableCaching注解;
(5)查询方法上要添加@Cacheable注解;
(6)对数据进行写操作的方法上要添加@CacheEvict注解;
(7)对于需要手工操作Redis的方法,需通过RedisTemplate来获取操作对象。

学习参阅声明

1.--【从原理到实战(2023最新版)】--bilibili

2.《Redis深度历险--核心原理与应用实践》

标签:...,--,元素,Redis,value,键值,key,集合,数据结构
From: https://blog.csdn.net/hongjian006/article/details/143169281

相关文章

  • 笔试强训1)
    题1题目描述:算法原理:我们可以利用哈希表来将其中一个数组的元素放进哈希表,哈希表具有天然去重效果。再把另一个数组的每个元素拿来在哈希表中找,把相同的添加进要返回的顺序表中,然后再将该元素从哈希表中删除但是我们能用数组来模拟哈希表就可以不要直接去new一个哈希表,......
  • 苍穹外卖 将菜品缓存到Redis
        CategoryController,用户端查询分类id及其分类下对应的菜品,假如是第一次查询,那么就从数据库中查询并加入redis缓存中,若不是第一次查询,那么直接从redis中查询,不再查询数据库。//redis缓存菜品,减少数据库的查询//在数据库中查找属于IO,假如有很多用户同时访问,那么......
  • <项目代码>YOLOv8火焰烟雾识别<目标检测>
     YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如FasterR-CNN),YOLOv8具有更高的检测速度和实时性。1.数据集介绍数据集详情可以参考博主写的文章<数据集>YOLO火焰烟雾......
  • Apple 新品发布会亮点有哪些 | Swift 周报 issue 61
    文章目录前言新闻和社区苹果据称正洽谈投资OpenAI英伟达也有意跟投消息称苹果公司服务部门将裁员约百人,波及AppleBooks/AppleNews等业务苹果拟9月10日举行今年最重磅新品发布会,iPhone16亮相?都有哪些看点?提案正在审查的提案Swift论坛推荐博文话题讨论关......
  • 苹果仍在研发更大尺寸的 iMac | Swift 周报 issue 60
    文章目录前言新闻和社区消息称苹果仍在研发更大尺寸的iMac屏幕超过30英寸最新!苹果大动作AppleEntrepreneurCamp现已开放申请提案通过的提案Swift论坛推荐博文话题讨论关于我们前言本期是Swift编辑组自主整理周报的第六十期,每个模块已初步成型。各位读......
  • 代码随想录算法训练营第七天|LeetCode 344.反转字符串、LeetCode 541.反转字符串Ⅱ、
    LeetCode 344.反转字符串题目链接:LeetCode344.反转字符串文章链接:代码随想录题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示......
  • 图像处理的实现与应用(TypeScript 版)
    图像处理是现代技术中的重要应用之一,广泛用于图像分析、计算机视觉和人工智能。本文使用TypeScript编写一些图像处理的基本操作,包括灰度转换、去除边框、提取有效区域和图像分割等。这些操作基于HTML5Canvas,实现起来直观且高效。环境准备首先确保你有基础的TypeScript项目......
  • 图像处理的实现与应用(PHP 版)
    图像处理在网络应用中十分重要,常用于图像分析、数据处理和用户交互。本文将使用PHP实现一些基本的图像处理操作,包括灰度转换、去除边框、提取有效区域和图像分割。环境准备确保你的PHP环境已安装GD库,这是进行图像处理的核心扩展。以下示例假设你有一个基本的PHP服务器环......
  • cf 981 F.Kosuke's Sloth
    F.Kosuke'sSloth思路由皮亚诺定理可知,模数为\(k\)的循环节长度不会超过\(6k\),所以我们可以暴力枚举找到第一个\(k\)的倍数的位置\(p\),答案即为\(pn\),时间复杂度复杂度\(O(m)\)相关证明:PisanoPeriod-Shiina_Mashiro-博客园推论:斐波那契数列取余是否有规律?-知乎代......
  • 验证码图像处理(JavaScript 版)
    图像处理在现代网页应用中扮演着重要角色,常用于图像分析和用户交互。本文将使用JavaScript和HTML5Canvas实现一些基本的图像处理操作,包括灰度转换、去除边框、提取有效区域和图像分割。环境准备首先,确保你有一个基本的HTML文件,其中包含一个Canvas元素。以下是示例结构:......