Redis
Redis 介绍
远程字典服务
性能几乎最快的 非关系型(轻量级)数据库
- Redis 是 Key-Value 型 NoSQL 数据库
- Redis 将 数据存储在内存中,同时也能 持久化到磁盘
- Redis 常用于 缓存,利用内存的高效 提高程序的 处理速度。
- Redis 是一个 内存中的数据结构存储系统;可用作 数据库,缓存、消息代理 中间件
默认端口是 ==6379 ==
特点:
- 速度快
- 广泛的语言支持
- 持久化
- 多种数据结构
- 主从复制
- 分布式 与 高可用
使用场景:
- 说法一:
- Redis 非常适合处理 小而热 的数据,而且是 读写 都比较频繁的热数据。
- 说法二:
- 不要在redis中频繁更新数据
- 跟RDB持久化没关系,跟AOF持久化有关系。RDB持久化是在指定的时间间隔内,把内存中的数据写入到磁盘中,然后指定的目录下生成一个rdb文件。
- AOF持久化会记录每次写命令然后生成aof文件。每秒几百次更新,aof都会记录每次set的命令,会导致aof文件越来越大。
注意事项:
https://blog.csdn.net/weixin_45178729/article/details/124082809
- 冷热数据分离,不要将所有数据全部都放到 Redis 中
- 不同的业务数据要分开存储
- 存储的Key一定要设置超时时间
- 对于必须要存储的大文本【+超过500字节】数据一定要压缩后存储
- 线上Redis禁止使用Keys正则匹配操作
- 如果有类似需求,请使用scan命令代替!
- 可靠的消息队列服务
- 谨慎全量操作Hash、Set等集合结构
- 根据业务场景合理使用不同的数据结构类型
- 命名规范
- 除了默认的0号库以外,其它的都需要通过一个额外请求才能使用。所以用前缀作为命名空间可能会更明智一点。
- 线上禁止使用monitor命令
- 禁止大string
- redis容量
- 单实例的内存大小不建议过大,建议在10~20GB以内。
- redis实例包含的键个数建议控制在1kw内,单实例键个数过大,可能导致过期键的回收不及时。
- 可靠性
- 需要定时监控redis的健康情况:使用各种redis健康监控工具,实在不行可以定时返回redis 的 info信息。
- 客户端连接尽量使用连接池(长链接和自动重连)
Redis 安装与启动
Linux 系统安装:
Redis 一般都用于 linux 系统
- 进入 Redis 官网,进入下载
- 找到要下载的版本,可以直接 download 或 在 Linux 里 使用 wget 安装。
wget https://download.redis.io/releases/redis-6.2.10.tar.gz
tar xzf redis-6.2.10.tar.gz
cd redis-6.2.10/
make
重要文件:
- redis.conf:配置信息
- src/redis-server:启动命令
- src/redis-cli:连接客户端
启动 Redis: - 进入 Redis 目录下,输入命令:./src/redis-server redis.conf
Windows 系统安装:
微软重构了一款在 windows 开发的 Redis
网站:https://github.com/MicrosoftArchive/redis
但是已经停止更新很久了(上一次是 2016),因此不能放在线上服务器,只能用于自己学习练习等。
- 解压文件
- 打开 命令控制符界面,转到 解压的路径下
- 输入命令:redis-server redis.windows.conf
a. 当出现:The server is now ready to accept connections on port 6379 ,则说明启动成功了
Linux 操作 Redis
-
启动:./src/redis-server redis.conf
- 默认为在前台运行,按 Ctrl + C 或 关闭当前终端 退出
-
强制关闭(不推荐):kill -9 进程ID
- 首先可以使用 netstat -tulpn | grep 6379 命令查看 进程ID
-
更建议在 Redis客户端 中进行关闭:./src/redis-cli shutdown
-
连接(进入) Redis 客户端:./src/redis-cli
- 后可 继续跟命令,代表在客户端中执行此命令
- 后可 继续跟命令,代表在客户端中执行此命令
redis.conf 的常用基本配置
使用 vim redis.conf 进行更改配置,使用 行号gg 或 ==/word ==(n) 来快捷定位
- daemonize:是否启用后台运行(守护进程方式),默认 no 如:daemonize yes
- port: 设置端口号默认6379 如:port 6379
- logfile: 设置日志文件 如:logfile “.log日志文件”
- 此时便会生成指定日志文件
- databases: 设置 redis 数据库的总量 如:databases 255
- Redis 数据库用编号区分,默认从 0 开始
- dir: 设置数据文件 存储目录,默认 ./ 如:dir 数据文件目录
- Redis 全量备份文件:dump.rdb :在 内存中对Redis数据 进行的任何操作都会同步的在硬盘中利用 .rdb 文件进行全量保存。以防止 宕机 不会造成数据丢失
- requirepass:设置客户端密码 如:requirepass 123456
- protected-mode:是否开启保护模式,默认为 yes
- 保护模式下 只允许指定的 ip 地址才能访问 Redis 服务。
- bind:设定指定的 ip 才能访问此 Redis 服务。默认为 127.0.0.1
- bind 0.0.0.0:代表所有 ip 的主机都能访问。
Redis 客户端
连接(进入) Redis 客户端
- ./src/redis-cli [客户端命令]
-
[客户端命令],代表在客户端中执行此命令
-
-p:指定端口号;默认为 6379,当更改了端口号时需要指定端口。
-
常用 通用 命令:
- ping:检查服务,若返回 PONG 则代表客户端正常启动
- exit:退出 客户端
- shutdown:关闭 Redis 服务
- select dbID:选择数据库
- Redis 数据库用编号区分,默认当前是 0 号,默认有 16 个数据库(0~15),在 redis.conf 中 修改数量
- auth 密码:客户端密码 登录验证
- 若 设置了密码而没有登录验证,则任何命令都会报错 (error) NOAUTH Authentication required.
- clear:清空客户端屏幕。
- set key value:增加 键值对。
- 若已存在 key,则 覆盖 value
- mset:批量增加
- get key:查询指定 key 的 value。
- mget:批量查询
- keys pattern:根据 通配符表达式 查询 key。
- keys *:查询所有 key
- dbsize:返回 key 的总数。
- 底层通过一个 计数器 来记录所有数据的总量
- exists key:检查指定 key 是否存在。
- 1 存在,0 不存在
- del key[ key2]:删除指定 key。多个用空格分隔。
- 返回删除 的数量
- expire key seconds:设置指定 key 在 多少秒后 过期(存活时间)。
- expire hello 20;设置 key=hello 20秒后过期
- ttl key:查看 key 的过期剩余时间。
Redis 数据类型
String:字符串 类型;可以为数字(Integer)
- 最大 512mb(兆),建议单个 字符串 不超过 100kb,否则在内存中提取的效率会大大降低。
- {incr | decr} key:对数字进行 自增 / 自减 1。
- {incrby | decrby} key step:对数字进行 自增 / 自减 指定步长值。
Hash:Hash 类型;键值对
-
用于存储 结构化数据,例如 一个实体对象。(多个 对象常用 :编号 分隔 emp:1)
-
hset key hashKey hashValue:增加 Hash 类型的 数据,可批量。 hset emp:1 name cjx age 20
- hmset:批量 增加。现在 hset 已具备此功能了。
-
hget key hashKey:获取 指定 key 的 hashkey 的 value。 hget emp:1 name
- hmset:批量 查询
-
hgetall key:查询指定 key 的 所有键值对
-
hdel key hashKey:删除 指定 key 的 hashKey,可批量。
-
hexists key hashKey:检查 是否存在 指定 key 的 hashKey
-
hlen key:获取指定 key 的长度
List:列表 类型;数组
https://www.runoob.com/redis/redis-lists.html
- List 列表就是一系列 字符串的“数组”,按插入顺序排序。
- List 列表最大长度为 (2^32)-1,可以包含 40亿 个元素。
- 增加:
- rpush key v[ v2]:右侧插入
- lpush key v[ v2]:左侧插入
- 删除:
- rpop key[ count]:弹出 右侧 count 个元素,默认 count 为 1
- lpop key[ count]:弹出 左侧 count 个元素,默认 count 为 1
- lrange key start stop:查询 指定 列表中 下标从 start 开始往后 stop 位的元素。
- stop: -1 代表 最后一个元素,以此类推
- lindex key index:查询指定下标的值。
- lset key index newValue:修改指定下标 的值。
- llen key:查询列表长度
- lrem key count value:删除 count 数量个值为 value 的元素。
Set:集合 类型;字符串的无序集合,集合成员是唯一的
https://zhuanlan.zhihu.com/p/395039882
- 最大长度为 (2^32)-1
- sadd key v[ v]:增加 Set 类型 的 数据,可批量。
- 对 一个Set 插入了 已有 的元素,(Integer) 0
- smembers key:查询 指定 key 的所有数据。
- srem key v[ v2]:删除元素,可批量
- scard key:统计 指定 集合 下有多少个 元素
- sismember key member:判断 member 是否为 key 集合中的元素。
- smismember key member [member …]:判断给定的多个 member 是否为 key 集合中的元素。
- 返回 n 行,对于每一个 member 元素,存在集合key中返回 1 表示,否则返回 0 。
- spop key [count]:从集合中随机移除 count 个元素,并返回该元素值。
- count 未指定时为 1。
- 如果只想返回元素但不移除,使用 srandmember 命令。
- sinter key[ key2[ key3]]:查询 交集 。
- sunion key[ key2[ key3]]:查询 并集 。
- sdiff key[ key2[ key3]]:查询 差集 ,key 中有而 key2 中没有的。
- 小技巧:在第一个 key 中排除掉 交集,剩下的就是差集。
- 若有 三个及以上,则:前两个求差集,再用结果与下一个求差集。
- 小技巧:在第一个 key 中排除掉 交集,剩下的就是差集。
Zset:有序集合 类型;字符串的有序集合,集合成员是唯一的
http://c.biancheng.net/redis_command/zset/
- 每一个元素都会关联一个 double 类型的分数,Redis 正是通过分数来为集合中的成员进行 从大到小的排序。
- 分数可以重复
- zadd key score v[ score2 v2]:添加,每个元素都有一个 double 类型的分数;可批量。
- zrange key start stop:查询 集合中 下标从 start 开始往后 stop 位的元素。
- stop: -1 代表 最后一个元素,以此类推
- withscores:在每一个元素的下方展示分数。
- zrangebyscore key sStart sEnd:查询 集合中 分数在[sStart, sEnd] 之间的所有元素
- withscores:在每一个元素的下方展示分数。
- zscore key value:获取 key 下面的 value 的分数
- zrem key v[ v2]:删除元素,可批量
- zcard key:统计 指定 集合 下有多少个 元素
- zcount key sStart sEnd:统计 集合中 分数在[sStart, sEnd] 之间的元素个数。
- zrank key value:获取 key 下面的 value 的下标