文章目录
Redis 6.0学习指南
第一章 引言
Redis简介
Redis 是一个开源(BSD许可)、基于内存、高性能的数据结构,可以作为K-V数据库、缓存、消息代理(message broker)和流引擎。
Redis提供了许多数据结构,诸如String、Hash、List、Set、Sorted Set、BitMap、Hyperloglog、Geospatial index和Stream。
Redis高性能因素
- 纯内存存储
- 单线程操作,避免了频繁的上下文切换
- 采用了非阻塞I/O多路复用机制
使用Redis可能遇到的问题
- 缓存和数据库双写一致性问题
- 缓存雪崩问题
- 缓存击穿问题
- 缓存的并发竞争问题
Redis下载
Redis 使用标准版本标记进行版本控制:major.minor.patchlevel。偶数的版本号表示稳定的版本, 例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的版本号用来表示非标准版本。
Redis官方下载地址:https://redis.io/download/
基本配置
redis启动这一块不会出啥问题,这边就直接复制老博客内容了。
修改redis.windows.conf文件,设置maxmemory 大小
#maxmemorty <bytes>
maxmemorty 1024000000
设置redis密码
#requirepass foobared
requirepass 123456
启动redis
redis-server.exe redis.windows.conf
将redis加入到windows的服务中(service和loglevel前都是两个-)
redis-server –service-install redis.windows.conf –loglevel verbose
第二章 数据库与键
Key
重命名
rename key newKey
如果在rename之前,键java已经存在,那么它的值也将被覆盖。
为了防止被rename覆盖,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。
随机返回一个键
randomkey
键过期
//键在seconds秒后过期
expire key seconds
//键在秒级时间timestamp后过期
expireat key timestamp
//键在milliseconds毫秒后过期
pexpire key milliseconds
//键在毫秒级时间戳timestamp后过期
pexpireat key milliseconds-timestamp
但无论是使用过期时间还是时间戳,秒级还是毫秒级,在Redis内部最终使用的都是pexpireat。
查看过期时间
//查询键的剩余过期时间 秒级
ttl key
//查询键的剩余过期时间 毫秒级
pttl key
有3种返回值:
- 大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。
- -1:键没有设置过期时间。
- -2:键不存在。
清除过期时间
persist key
遍历键
当数据量较小时,可以使用Keys命令返回所有满足条件的Key集合。但是当数据量较大时,由于此命令通过遍历匹配key所以很容易阻塞Redis服务;另外由于不能使用limit命令,Keys命令会返回所有匹配数据,导致输出过多,所以生产环境一般不使用此命令。
全量遍历键
keys pattern
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
渐进式遍历
scan cursor [match pattern] [count number]
cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0表示遍历结束。
match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像。
count number是可选参数,它的作用是表明每次要遍历的键个数,默认值是10,此参数可以适当增大。
Database
Redis中默认有16个相互空间独立的数据库(Database)。每个数据库都有一个整数类型id,新客户端默认选择的数据库是id为0的数据库。
typedef struct redisDb {
dict *dict; /* The keyspace for this DB */
dict *expires; /* Timeout of keys with a timeout set */
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/
dict *ready_keys; /* Blocked keys that received a PUSH */
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
int id; /* Database ID */
long long avg_ttl; /* Average TTL, just for stats */
unsigned long expires_cursor; /* Cursor of the active expire cycle. */
list *defrag_later; /* List of key names to attempt to defrag one by one, gradually. */
} redisDb;
相关配置
数据库的数量可以在配件文件中,通过databases参数进行配置。
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
常用命令
切换数据库
可以通过调用select [id]的命令来改变当前客户端所选数据库,如下所示。随后,所有的命令将使用DB2,直到再次切换到另一个数据库下。每个数据库都有属于自己的空间,不必担心之间的key冲突。不同的数据库下,相同的key取到各自的值。
select 2
清除当前数据库
flushdb
清除所有数据库
flushall
第三章 通讯协议RESP
Redis制定了RESP(REdis Serialization Protocol, Redis序列化协议) 实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易被人类识别。
举个例子
"set hell world"基于RESP格式化之后的结果是:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
格式化之后:
$3
SET
$5
hello
$5
world
换行符 \r\n 用于区分命令请求的若干参数,*3表示该命令请求有3个参数,$3、$5 和 $5 表示该参数字符串长度。
返回结果格式
Redis的返回结果类型分为以下五种,
- 状态回复 在RESP中第一个字符为“+”。
- 错误回复 在RESP中第一个字符为“-”。
- 整数回复 在RESP中第一个字符为“:”。
- 字符串回复 在RESP中第一个字符为“$”。
- 多条字符串回复 在RESP中第一个字符为“*”。
附录
附录a. 网站资料
网站收录
官方网站
Redis 官网文档非常丰富,它的文档非常值得啃。Redis官网的精华文章都在顶部导航Documentation连接中。
国内社区
如果你的英文不佳,可以去看看中文Redis网站。
Github
github项目地址
antirez 博客
Redis 作者 antirez 大佬的博客有很多关于 Redis 的最新消息,除此之外还会有一些作者新发现的、好玩的技术知识点。
Redis 扩展模块
Redis 4.0 增加了模块化之后,越来越多的 Redis 模块雨后春笋般的被开发出来。这个页面包含了开源市场上所有的 Redis 模块列表,有一些模块比较稳定,还有一些处于 Alpha 阶段。读者可以从中挑选出自己感兴趣的模块研究学习。