Redis

目录

一、Redis简介

二、Redis数据结构

1.字符串(String)

2.哈希(Hash)

3.列表(List)

4.集合(Set)

[5.有序集合(sorted set)](#5.有序集合(sorted set))

三、Redis的数据持久化机制

1.RDB

RDB执行原理

2.AOF

四、Redis的数据过期策略

1.惰性删除

2.定期删除

五、Redis的数据淘汰策略


一、Redis简介

Redis是一个开源的、基于内存的键值对存储系统,通常被用作数据库、缓存和消息中间件。

  • **内存存储:**数据主要存储在内存中,读写速度极快,也支持持久化到磁盘。
  • 数据结构: Redis支持多种数据结构,包括:
    • 字符串(String)
    • 哈希(Hash)
    • 列表(List)
    • 集合(Set)
    • 有序列表(Zset)
  • 持久化支持:
    • RDB
    • AOF

数据结构和丰富的功能,成为现代应用架构中不可或缺的组件。

二、Redis数据结构

1.字符串(String)

常用命令

1.设置指定key的值

复制代码
SET key value    //SET study redis指定key是study的值为redis

2.获取指定key的值

复制代码
GET key    //GET study 获取key为study的值

3.获取key为study的值的长度

复制代码
STRLEN study

4.将key为study的值增加

复制代码
INCR study        //将key为study的值增1
INCREBY study 5   //将key为study的值增5

5.将key为study的值减少

复制代码
DECR study        //将key为study的值减1
DECRBY study 5    //将key为study的值减5

6.如果key存在,追加在原value末尾

复制代码
APPEND study db    //若原value为redis,拼接后为redisdb

7.返回key中字符串值得子字符

复制代码
GETRANGE study 0 3 //若value为redis,则返回redi

8.同时设置一个或多个键值对

复制代码
MSET key value [key value ...]
//如MSET k1 v1 k2 v2,即设置了两个键值对分别是<k1,v1>、<k2,v2>

9.同时设置一个或多个键值对,当且仅当所有给定key都不存在

复制代码
MSETNX key value [key value ...]
//当所有key都成功设置,返回1
//如果至少有一个key已经存在,设置失败,返回0

10.获取所有给定key的值

复制代码
MGET key1 [key2 ...]

11.将value关联到key,并将key的过期时间设为5(秒为单位)

复制代码
SETEX key 5 value

2.哈希(Hash)

Redis中hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合存储对象

Redis中每个hash可以存储2^32-1键值对

常用命令

1.删除一个或多个哈希表字段

复制代码
HDEL key field1 [field2]

2.查看哈希表key中,指定的字段是否存在

复制代码
HEXISTS key field

3.获取存储在哈希表中指定字段的值

复制代码
HGET key field

4.获取在哈希表中指定key的所有字段和值

复制代码
HGETALL key

5.为哈希表key中的指定字段的数值加上增量increment

复制代码
HINCREBY key field increment //指定字段的整数值
HINCREBYFLOAT key field increment //指定字段的浮点数值

6.获取哈希表中所有字段

复制代码
HKEYS key

7.获取哈希表中字段数量

复制代码
HLEN key

8.获取所有给定字段的值

复制代码
HMGET key field1 [field2]

9.同时将多个field-value对设置到哈希表key中

复制代码
HMSET key field1 value1 [field2 value2]

10.将哈希表key中字段field的值设置为value

复制代码
HSET key field value
HSETNX key field value //字段field不存在时,设置值

11.获取哈希表中所有值

复制代码
HVALS key

3.列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表头部(左侧)或者尾部(右侧)

常用命令

1.移出并获取列表的元素,没有元素会阻塞队列直到等待超时或发现可弹出元素为止

复制代码
BLPOP key1 [key2] timeout //第一个元素
BRPOP key1 [key2] timeout //最后一个元素

2.从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;没有元素会阻塞队列直到等待超时或发现可弹出元素为止

复制代码
BRPOPLPUSH source destination timeout

3.通过索引获取列表中的元素

复制代码
LINDEX key index

4.在列表的元素前或后插入元素

复制代码
LINSERT key BEFORE|AFTER pivot value

5.获取列表长度

复制代码
LLEN key

6.移出并获取列表第一个元素

复制代码
LPOP key

7.将一个或多个值插入到列表头部

复制代码
LPUSH key value1 [value2]

8.将一个值插入到已存在的列表头部

复制代码
LPUSHX key value

9.获取列表指定范围内的元素

复制代码
LRANGE key start stop

10.移除列表元素

复制代码
LREM key count value //count不为零时是需要移除个数的绝对值,为零是移除所有与value相等的值

11.通过索引设置列表元素的值

复制代码
LSET key index value

12.对一个列表进行修剪,只保留指定区间内的元素,区间外都将删除

复制代码
LTRIM key start stop

13.移除列表的最后一个元素,返回值为移除的元素

复制代码
RPOP key

14.移除列表的最后一个元素,并将该元素添加到另一个列表并返回

复制代码
RPOPLPUSH source destination

15.在列表中添加一个或多个值到列表尾部

复制代码
RPUSH key value1 [value2]

16.为已存在的列表添加值

复制代码
RPUSHX key value

4.集合(Set)

Redis的Set是String类型的无序集合。集合成员是唯一的,集合对象的编码可以是intset或者hashtable

常用命令

1.向集合添加一个或多个成员

复制代码
SADD key member1 [member2]

2.获取集合的成员数

复制代码
SCARD key

3.返回第一个集合与其他集合之间的差异

复制代码
SDIFF key1 [key2]

4.返回给定所有集合的差值并存储在destination中

复制代码
SDIFFSTORE destination key1 [key2]

5.返回给定所有集合的交集

复制代码
SINTER key1 [key2]

6.返回给定所有集合的交集并存储在destination中

复制代码
SINTERSTORE destination key1 [key2]

7.判断member元素是否是集合key的成员

复制代码
SIMEMBER key member

8.返回集合中所有成员

复制代码
SMEMBERS key

9.将member元素从source集合移动到destination集合

复制代码
SMOVE source destination member

10.移除并返回集合中的一个随机元素

复制代码
SPOP key

11.返回集合中一个或多个随机数

复制代码
STANDMEMBER key [count]

12.移除集合中一个或多个成员

复制代码
SREM key member1 [member2]

13.返回所有给定集合的并集

复制代码
SUNION key1 [key2]

14.所有给定集合的并集存储在destination集合中

复制代码
SUNIONSTORE destination key1 [key2]

5.有序集合(sorted set)

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

每个元素会关联一个double类型的分数,通过分数为集合中的成员进行从小到大的排序

有序集合的成员是唯一的,但分数可以重复

常用命令

1.向有序集合添加一个或多个成员,或者更新已存在成员的分数

复制代码
ZADD key score1 member1 [score2 member2]

2.获取有序集合的成员数

复制代码
ZCARD key

3.计算在有序集合中指定区间分数的成员数

复制代码
ZCOUNT key min max

4.有序集合中对指定成员的分数加上增量increment

复制代码
ZINCRBY key increment member

5.计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合destination中

复制代码
ZINTERSTORE destination numkeys key [key ...]

6.在有序集合中计算指定字典区间内成员数量

复制代码
ZLEXCOUNT key min max

7.通过索引区间返回有序集合指定区间内的成员

复制代码
ZRANGE key start stop [WITHSCORES]

8.通过字典区间返回有序集合的成员

复制代码
ZRANGEBYLEX key min max [LIMIT offset count]

9.通过分数返回有序集合指定区间内的成员

复制代码
ZRANGEBYSCORE key min max [WITHSCORES]

10.返回有序集合中指定成员的索引

复制代码
ZRANK key member

11.移除有序集合中的一个或多个成员

复制代码
ZREM key member [member ...]

12.移除有序集合中给定的字典区间的所有成员

复制代码
ZREMRANGEBYLEX key min max

13.移除有序集合中给定的排名区间的所有成员

复制代码
ZREMRANGEBYRANK key start stop

14.移除有序集合中给定的分数区间的所有成员

复制代码
ZREMRANGEBYSCORE key min max

15.返回有序集合中指定区间的成员,通过索引,分数从高到低

复制代码
ZREVRANGE key start stop [WITHSCORES]

16.返回有序集合中指定分数区间内的成员,分数从高到低排序

复制代码
ZREVRANGEBYSCORE key max min [WITHSCORES]

17.返回有序集合中指定成员的排名,有序集合成员按分数值递减排序

复制代码
ZREVRANK key member

18.返回有序集合中,成员的分数值

复制代码
ZSCORE key member

19.计算给定的一个或多个有序集合的并集,并存储在新的key中

复制代码
ZUNIONSTORE destination numkeys key [key ...]

三、Redis的数据持久化机制

1.RDB

RDB(Redis Database Backup file (Redis数据备份文件)),也被叫做Redis数据快照。把内存中的所有数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件,恢复数据

RDB执行原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并吸入RDB文件。

fork采用copy-on-write技术:

当主进程执行读操作时,访问共享内存;

当主进程执行写操作时,拷贝一份数据,执行写操作。

2.AOF

AOF(Append Only File(追加文件))。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

AOF默认关闭,需要修改redis.conf配置文件来开启AOF

复制代码
#是否开启AOF,默认no
appendonly yes
#AOF文件名称
appendfilename "appendonly.aof"

AOF的命令记录频率

复制代码
#每执行一次写命令,立即记录AOF
appendfsync always
#写命令执行完先放入AOF缓冲区,然后每隔1s将缓冲区数据写到AOF文件中,默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

四、Redis的数据过期策略

1.惰性删除

设置该key过期时间后,不去管它,当需要该key时,再去检查其是否过期,如果过期就删除它,反之返回该key

**优点:**对CPU友好,只会在使用该key时才会进行检查

**缺点:**对内存不友好,如果一个key已过期但是一直没使用,就会一直存在内存中

2.定期删除

每隔一段时间,对一些key进行检查,删除其中过期的key(从一定数量的数据库中取出一定数量的随机key进行检查)

定期删除有两种模式:

SLOW模式:定时任务,执行频率默认10hz,每次不超过25ms,可以通过redis.conf的hz选项来调整这个次数

FAST模式:频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

**优点:**可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响,定期删除也可以有效的释放过期key占用的内存

**缺点:**难以确定删除操作执行的时长和频率

五、Redis的数据淘汰策略

当Redis中的内存不够用时,此时再向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

Redis支持8中不同策略:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认策略。
  • volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。
  • allkeys-random:对全体key,随机进行淘汰。
  • volatile-random:对设置了TTL的key,随机进行淘汰。
  • allkeys-lru:对全体key,基于LRU算法进行淘汰。
  • volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
  • allkeys-lfu:对全体key,基于LFU算法进行淘汰
  • volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰
相关推荐
运维行者_6 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev6 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1236 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器6 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天7 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
桌面运维家7 小时前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
南墙上的石头8 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画9 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc9 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t10 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb