Redis(Remote Dictionary server)
key-value
C语言编写
可以做缓存,基于内存存储,提供持久化机制
主从、哨兵以及集群搭建方式,方便横向扩展以及垂直扩展
2.2 使用redis-cli连接数据库
docker exec -it id bash
在容器内使用redis连接 redis-cli
Redis常用命令
常用数据结构
- key-string:一个key对应一个值
- key-hash:一个key对应一个map
- key-list:一个key对应一个列表
- key-set:一个key对应一个集合(交集 并 差 )
- key-zset:一个key对应一个有序集合(排行榜)
另外三种不常用:
- HyperLogLog:计算近似值
- GEO:地理位置
- BIT:字符串 byte[]
3.1 string常用
- 添加 set key value
- 取值 get key
- 批量 mset key value []
- 自增 incr key
- 自减 decr key
- 自增指定数量 incrby key increment
- 自减指定数量 decrby key increment
- setex 设定值的时候指定生存时间 setex key second value
- setnx key value key存在,什么事不做
- append key value
- strlen key 查看value字符串长度
3.2 hash
- 存储数据 hset key field value
- 获取数据 gset key field
- 批量操作 hmset key field value field value hmget key field field
- 自增 hincreby key field increment
- key-field存在就什么都不做 hsetnx key field value
- 检查field是否存在 hexist key field
- 删除key对应的field(多个) hdel key field field2
- 获取当前hash全部的field和value hgetall key
- 获取当前hash全部field hkeys key
- 获取所有value hvals key
- 获取field数量 hlen key
3.4 list
- 存储数据(左侧)lpush key value value
- 右侧 rpush key value value
- key不存在或者不是list结构什么都不做,不能批量操作 lpushx key value rpushx key value
- 指定位置存储(覆盖,index超出会失败) lset key index value
- 弹栈获取数据 ,数据会被移除 lpop rpop key
- 获取指定索引范围数据 lrange key start(0开始)stop(-1倒数第一)
- 指定索引位置的数据 lindex key index
- 获取长度 llen key
- 删除列表(删除count个value,count>0 左侧向右侧,count<0右侧到左侧,count===0删除所有) lrem key count value
- 保留指定范围的数据,其余删除 ltrim key start stop
- 将一个列表中最后的一个数据插入到另外一个列表头部位置 rpoplpush list1 list2
3.5 set
无序,不允许重复
- 存储数据 sadd key member member
- 获取数据 smember key
- 随机获取数据 spop key [count]
- 交集命令 sinter set1 set2 ...
- 并集 获取全部集和中的数据 sunion set1 set2 . . .
- 差集 sdiff set1 set2
- 删除数据 srem key member member
- 查看当前集和是否有某个值 sismember key member
3.6 zset
有序,不允许重复
- 添加数据 zadd key score member score member(score必须为数值,member不允许重复)
- 修改member分数 zincrby key score member(member存在正常加分数,若不存在,相当于zadd)
- 查看指定member分数 zscore key member
- 获取zset中数据数量 zcard key
- 查询一定分数范围的member数量 zcount key min max
- 删除zset zrem key member member
- 根据分数从小到大排序,获取指定范围内的数据(widthscore如果添加这个参数,会返回member对应的分数)zrange key start stop [witthscore]
- 根据分数从大到小排序,获取指定范围内的数据(widthscore如果添加这个参数,会返回member对应的分数)zrevrange key start stop [withscore]
- 根据分数的返回去获取数据(widthscore表示同时返回score) zrangebyscore key min max [withscore] [limit offset count] (不等于 采用( 相当于 <)(最大值+inf 最小值-inf)
- 根据分数的返回去获取数据(widthscore表示同时返回score) zrangebyscore key max min [withscore] [limit offset count]
3.7 key常用命令
- 查看Redis中的全部key(pattern:*)keys pattern
- 查看某一个key是否存在(1 key存在,0 key不存在)exits key
- 删除key del key key
- 设置key的生存时间,单位为秒、毫秒 expire key second pexpire key milliseconds
- 设置key生存时间到固定时间点 expireat key timestamp pexpireat key milliseconds
- 查看key剩余生存时间,单位为秒、毫秒 ttl key pttl key(-2 当前key不存在,-1当前key没有剩余生存时间)
- 移除key的生存时间 persist key(1 移除成功,0 可以不存在时间或者key不存在)
- 选择操作的库 select 0~15
- 将key移动到另外一个库中 move key db
3.8 库的常用操作
- 清空当前所在的库 flushdb
- 清空所有数据库 flushall
- 当前数据库key个数 dbsize
- 查看最后一次操作的时间 lastsave
- 实时接收redis收到的目录 monitor
4.redis管道操作
redis采用的是CS架构,客户端与服务器端通过tcp协议进行连接通信,因此无论是发出请求还是接收响应,都必须经过网络传输。在tcp连接过程中,客户端和服务器端是通过阻塞式的一问一答方式进行通信的,即客户端必须接收到服务端完整的响应,才能进行后续请求。
有时我们会在短时间内发送大量互不依赖的命令(例如:后执行的命令不需要使用前面返回的结果)。由于网络传输不可避免的会造成一定的延迟,特别是在跨机器远程访问redis的时候,如果使用常规的方式,一条命令对应一次请求和响应的话,大量命令累计的延迟会显得很高。redis的设计者考虑到这一点,在底层的通信协议上,通过支持"管道(pipeline)"来解决这一问题。
redis管道可以在一次tcp的请求中同时发送多条命令,并且将响应结果一次性的返回给客户端。对于既定数量的命令请求,redis管道通过减少客户端和服务器端的通信次数,来达到减少通信传输中往返时间的目的,提高效率
5.Redis 配置和集群
修改yml文件
version: '3.1'
services:
redis:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis
ports:
- 6379:6379
volumes:
- ./conf/redis.conf:/usr/local/redis/redis.conf
command:["redis-server","/usr/local/redis/redis.conf"]5.1 Auth
方式一:通过修改redis配置文件redis.conf,实现redis的密码校验
# Redis的AUTH密码
requirepass 666redis 127.0.0.1:6379> AUTH PASSWORD方式二:在第一次Redis时输入 Config set requirepass
5.2 Redis持久化机制
RDB是默认的持久化机制
- RDB持久化文件,速度快,二进制,传输方便
RDB持久化时机:
RDB持久化机制配置
save 900 1 900秒之内,有1个key改变了,就执行RDB持久化
save 300 10 300秒之内,有10个key改变了,就执行RDB持久化
save 60 10000 60秒之内,有10000个key改变了,就执行RDB持久化rdbcompression yes
dbfilename dump.rdb
- RDB无法保持数据的绝对安全
5.3Redis事务
Redis的事务:一次事务操作,改成功的成功,失败的失败。
先开启事务,执行一些列的命令,但是密码不会立即执行,会被放在一个队列中,如果执行事务,那么这个队列的命令全部执行,如果取消队列,则全部取消。
- 开启事务:multi
- 输入需要执行的命令,被放在一个队列中
- 执行事务:exec
- 取消事务:discard
Redis的事务可配上watch监听机制
在开启事务之前,先通过watch监听一个或多个key,开启事务后若其他客户端修改了我监听的key,事务会自动取消。
执行了事务或取消了事务,watch自动消除,不需要unwatch
5.4 AOF持久化策略
- AOF持久化机制默认关闭,官方推荐同时开启的RDB和AOF,更安全避免数据丢失。
- Redis 的持久化方式之一 RDB 是通过保存数据库中的键值对来记录数据库的状态。而另一种持久化方式 AOF 则是通过保存 Redis 服务器所执行的写命令来记录数据库状态。
- 相对RDB慢,存储的是个文本文件,后期文件会大,传输困难。
参数:
appendonly no:默认值为no,也就是说redis 默认使用的是rdb方式持久化,如果想要开启 AOF 持久化方式,需要将 appendonly 修改为 yes。
appendfilename "redis.aof":aof文件名,默认是"appendonly.aof"
appendfsync always:aof持久化策略的配置;always表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;
appendfsync everysec:everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。
appendfsync no:no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;
- AOF相对RDB更安全,推荐同时开启
AOF 文件恢复:重启 Redis 之后就会进行 AOF 文件的载入。异常修复命令:redis-check-aof --fix 进行修复
AOF和RDB混合机制:aof-use-rdb-preamble。
同时开启RDB与AOF注意事项:
如果同时开启AOF和RDB,Redis宕机重启后会加载一个持久化文件,优先选择AOF
如果先开启RDB后AOF,RDB会被AOF覆盖
AOF重写:当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。
5.5 主从架构
单机版Redis存在读写瓶颈问题(默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。)
#从节点
replicaof master 63795.6 哨兵
哨兵可以解决主从架构中的单点故障问题(当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。)
准备哨兵配置文件,手动启动
version: '3.1'
services:
redis1:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis1
ports:
- 7001:6379
volumes:
- ./conf/redis1.conf:/usr/local/redis/redis.conf
- ./conf/sentinel1.conf:/data/sentinel.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis2:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis2
ports:
- 7002:6379
volumes:
- ./conf/redis2.conf:/usr/local/redis/redis.conf
- ./conf/sentinel2.conf:/data/sentinel.conf
links:
- redis1:master
command: ["redis-server","/usr/local/redis/redis.conf"]
redis3:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis3
ports:
- 7003:6379
volumes:
- ./conf/redis3.conf:/usr/local/redis/redis.conf
- ./conf/sentinel.conf:/data/sentinel.conf
links:
- redis1:master
command: ["redis-server","/usr/local/redis/redis.conf"]daemonize yes 哨兵模式后台启动
sentinel monitor master localhost 6379 2 (主)指定master节点的ip和端口
sentinel monitor master master 6379 2 (从)指定master节点的ip和端口
sentinel down-after-milliseconds mymaster 10000
# 禁止保护模式 protected-mode no # 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。 sentinel monitor mymaster 192.168.11.128 6379 2 # sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码 # sentinel auth-pass <master-name> <password> sentinel auth-pass mymaster 123456
5.7 集群
主从加哨兵外,可提高Redis存储数据的能力
特点:
- 无中心
- ping-pang通讯
- 投票机制,数量必须为2n+1
- 默认分配16384个hash槽,在存储数据时会对key进行crc16的算法,并且对16384取余,根据结果存放到节点中。
- 为保持数据的安全,每个集群的节点至少跟着一个从节点

#docker-compose.yml
version: '3.1'
services:
redis1:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis1
environment:
- TZ=Asis/Shanghai
ports:
- 7001:7001
- 17001:17001
volumes:
- ./conf/redis1.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis2:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis2
environment:
- TZ=Asis/Shanghai
ports:
- 7002:7002
- 17002:17002
volumes:
- ./conf/redis2.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis3:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis3
environment:
- TZ=Asis/Shanghai
ports:
- 7003:7003
- 17003:17003
volumes:
- ./conf/redis3.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis4:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis4
environment:
- TZ=Asis/Shanghai
ports:
- 7004:7004
- 17004:17004
volumes:
- ./conf/redis4.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis5:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis5
environment:
- TZ=Asis/Shanghai
ports:
- 7005:7005
- 17005:17005
volumes:
- ./conf/redis5.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]
redis6:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis6
environment:
- TZ=Asis/Shanghai
ports:
- 7006:7006
- 17006:17006
volumes:
- ./conf/redis6.conf:/usr/local/redis/redis.conf
command: ["redis-server","/usr/local/redis/redis.conf"]#redis.conf
# 指定端口号
port 7001
# 开启redis集群
cluster-enabled yes
# 集群信息的文件
cluster-config-file nodes-7001.conf
#集群对外的ip地址
cluster-announce-ip 182.168.199.100
#集群对外的ip端口
cluster-announce-port 7001
##集群对外的总线端口
cluster-announce-bus-port 17001启动6个redis节点,,使用redis-cli管理集群
root@c282b367e6df:/data# redis-cli --cluster create 192.168.56.1:7001 192.168.56.1:7002 192.168.56.1:7003 192.168.56.1:7004 192.168.56.1:7005 192.168.56.1:7006 --cluster-replicas 1
# 登录集群
root@c282b367e6df:/data# redis-cli -h 192.168.56.1 -p 7001六 Redis常见问题
6.1 key生存时间到了,Redis会立即删除吗?
不会立即删除。
定期删除
Redis每隔一段时间会去查看Redis设置了过期时间的key,会100ms间隔中默认查看3个key。
惰性删除
如果查看一个已经过了生存时间的key,Redis会先查看当前key是否到了生存时间,直接删除key并返回空值。
6.2 淘汰机制
在Redis内存已经满了的时候添加数据执行淘汰机制。
volatile-lru:内存不足时,找过了生存时间的key(从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰)(推荐)
volatile-lfu:过了生存时间的key中删除最少频次的key
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-lfu:从数据集(server.db[i].dict)删除最近最少频次使用的
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错
设置方式
maxmemory-policy volatile-lru
设置最大内存
maxmemort
6.3 缓存机制
缓存穿透
查询数据Redis没有,数据库也没有
1.根据id查询,如果id是自增的,将id的最大值放在Redis中,在查询数据库之前比较一下id
2.id如果不是整形,可将id放在set中,用户查询前,可在set中查询一下是否有
3.获取客户端ip地址,可将ip的访问添加限制

缓存击穿
缓存中的热点数据突然到期,造成请求都去访问数据库,造成数据库宕机
1.在访问缓存中没有的时候,添加一个锁,让几个请求访问数据库,避免数据库宕机
2.热点数据生存时间去掉
缓存雪崩
大量缓存同时到期,最终大量的请求都去数据库
1.缓存设置随机时间,30-60分钟
缓存倾斜
热点数据放在一个redis节点上,redis无法承受大量请求,最终宕机
1.扩展主从架构,搭建大量从节点,环节redis压力
2.可在tomcat中做jvm缓存,在查询redis前先去查询tomcat中缓存

2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
华纳东方明珠客服电话是多少?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠开户专线联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
如何联系华纳东方明珠客服?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠官方客服联系方式?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服热线?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠开户客服电话?(▲182(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠24小时客服电话?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服邮箱?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠官方客服在线咨询?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
华纳东方明珠客服微信?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】
华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】
联系客服了解华纳圣淘沙开户
(183-8890-9465薇-STS5099】
华纳圣淘沙公司开户专属顾问
(183-8890-9465薇-STS5099】