Redis

Redis

基础操作

String

keys *
set key value/设置相同key后面会覆盖前面,加m(multi)
setnx k1 ds加m(multi)
get key 加m(multi)
exist key //存在返回1 不存在返回0
type key //查看类型
del key //删除
unlink key //异步删除
expire key time //设置过期时间
ttl key //显示过期时间 -1表示永不过期 -2表示已过期
dbsize //查看数据库大小
flushdb //清空数据库
flushall //清空所有数据库
append key value//追加值
strlen key //获取长度
incr key //对于数字值加一,原子的加
decr key //对于数字值减一
incrby key num//对于数字值加num
decrby key num//对于数字值减num
getrange key start end //获取指定范围
setrange key start abc //从指定范围修改
getset key llll //先获取再赋值
setex key time llll //创建并设置过期时间

List

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yqflh0ZV-1662079337339)(I:\java_note\截图\1661737691326.jpg)]

# list
#数据量小就是ziplist,数据量多时就有多个ziplist组成quicklist
lpush k1 v1 v2 v3
rpush k3 v1 v2 v3
lrange k1 0 -1
lpop k1 #从左边弹出值,值在健在,值完键消
rpop k3
rpoplpush k1 k2#从k1右边弹出值,将值推入k2左边
lindex k2 1#根据索引获取值
llen k2 
linsert k2 before "v11" "newv11" #在值为v11之前加入一个newv11
lrem k2 2 "newv11" #从左边删除2个newv11
lset k2 1 atguigu #将索引为1的值改为atguigu

Set

无序不重复

sadd k1 v1 v2 v3 
smembers k1 #显示k1中值
sismember k1 v1 #查看k1中有无v1
scard k1 #k1中值个数
srem k1 v1 v2 #删除k2中v1 v2值
spop k2 #随机弹出k2中的值
srandmember k2 2 #随机显示k2中两个值
smove k1 k2 v3 #将v3 从k1移入k2
sinter k2 k3 #两个集合交集
sunion k2 k3 #两集合并集
sdiff k2 k3 #k2对k3差集 

Hash

对应两种数据类型 ziplist和hashtable

hset user:1001 id 1
hget user:1001  name
hmset user:1002 name lisi age 20 id 2
hexists user:1002 name 
hkeys user:1002 #获取对象所有key
hvals user:1002 #获取对象所有value
hincrby user:1002 age 2 #自增
hsetnx user:1003 age 20 #不存在则增加

ZSet

底层结构数据结构是hash和跳跃表

zadd topn  200 java 300 c++ 400 mysql 500 php
zrange topn 0 -1
zrangebyscore topn 300 500 withscores
zrevrangebyscore topn 500 300
zincrby topn 50 java
zrem topn java
zcount topn 200 300
zrank topn mysql

发布和订阅

publish channel1 hellol

subscribe channel 订阅
publish channel message 发布

事务

Redis事务的主要作用就是串联多个命令防止别的命令插队。

multi开启事务的组队阶段,在输入multi之后所有的存取会存入队列当中不会立即执行

exec事务的执行阶段,执行队列当中的命令

discard取消队列当中的所有操作

在当组队阶段中出错时,事务执行会直接失败;当执行阶段出错时,仅有出错的那个操作执行失败

悲观锁:每一次执行都会上锁执行完之后解锁

乐观锁:利用版本号控制,拿数据时可以拿,但是要更新数据时会去监测版本号是否一致,redis默认就是使用乐观锁

事务特性

  1. 单独的隔离操作

    事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  2. 没有隔离级别的概念

    队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

  3. 不保证原子性

    Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

秒杀中连接超时问题:可以通过连接池解决

使用事务解决超卖问题:加事务-乐观锁

库存遗留问题通过LUA脚本解决:实际上是redis利用单线程的特性

持久化RDB

RDB(Redis Database)

在指定时间间隔内将内存中的数据集快照写入磁盘

持久化AOF

以日志形式记录每个操作,只记录写操作,不记录读操作,只许追加不可修改文件

![MLC@TO4K2P~6RDQ9P([(D](I:\java_note\截图\MLC@TO4K2P~6RDQ9P([(D.png)配置文件中 :appendonly 改为yes

当RDB和AOF同时开启以AOF为主

当aof文件出错时 bin目录下有修复操作

同步频率

appendfsync always:始终同步

appendfsync everysec:每秒同步

appendfsync no:不主动同步,同步时机交给操作系统

主从复制

1.读写分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6DJOdnB-1662079337341)(I:\java_note\截图\主从复制.png)]

2.容灾快速恢复

搭建主从

#创建如下配置文件,并以该文件启动redis服务端
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
masterauth [maser密码没有则删除此行]

redis-cli -p 6379连接对应端口的服务端

info replication查看服务端信息

在主从中,若主服务器挂掉,重连回来仍然是主服务器,从服务器挂掉之后重连不是从服务器

1、当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息
2、主服务器接到从服务器发送过来同步消息,把主服务器数据进行持久化,rdb文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
3、每次主服务器进行写操作之后,和从服务器进行数据同步

哨兵模式

自动实现反客为主,哨兵监测主机,主机挂掉后通过选举从机作为主机

实现

1.新建一个哨兵配置文件sentinel.conf,并在其中输入sentinel monitor mymaster 127.0.0.1 6379 1,若有密码还需要在配置文件中加上sentinel auth-pass mymaster [password]

mymaster是为监控对象起的名称 127.0.0.1 6379为需要监控的对象的地址 最后1为需要哨兵同意数量

选举机制

1.在启动的配置文件中有一个replica-priority 100属性 ,是反客为主的优先级,值越小优先级越高
2.选择和主机最接近的
3.选择启动服务时随机生成的最小runid

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgA3NzOL-1662079337342)(I:\java_note\截图\Snipaste_2022-08-31_15-11-04.png)]

集群

无中心化集群:不需要代理

Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

搭建集群

#服务端启动配置文件中添加
cluster-enable yes #开启集群模式
cluster-config-file nodes-6379.conf# 设置节点配置文件名称
cluster-node-timeout 15000#设定失联时间,超过时间自动进行主从切换

进入安装目录src下执行以下命令搭建集群

redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391
登录集群:redis-cli -c -p 6379
集群查看集群节点信息:cluster nodes

16384个插槽
16384 slots covered.
查看键在那个插槽:cluster keyslot key
查看插槽内键的数量:cluster countkeysinslot slot
查看插槽内num个数的键:cluster getkeysinslot solt num

问题解决

缓存穿透

现象

1.应用服务器压力变大
2.redis命中率变低
3.一直查询数据库

解决方案

1.对空值缩短过期时间
2.使用bitmap过滤拦截,设置可访问白名单
3.和运维人员配合,设置黑名单限制服务

缓存击穿

现象

1.数据库访问压力瞬时增大
2.redis里没有出现大量key过期
3.redis正常运行

原因

某个key过期,有大量请求访问这个key

解决方案

1.预设热门数据
2.监控热门数据,实时调整过期时间
3.使用锁

缓存雪崩

现象

1.应用服务器压力变大
2.大量key过期

解决方案

1.将缓存失效时间分散
2.构建多级缓存架构
3.使用锁或者队列
map过滤拦截,设置可访问白名单
3.和运维人员配合,设置黑名单限制服务

缓存击穿

现象

1.数据库访问压力瞬时增大
2.redis里没有出现大量key过期
3.redis正常运行

原因

某个key过期,有大量请求访问这个key

解决方案

1.预设热门数据
2.监控热门数据,实时调整过期时间
3.使用锁

缓存雪崩

现象

1.应用服务器压力变大
2.大量key过期

解决方案

1.将缓存失效时间分散
2.构建多级缓存架构
3.使用锁或者队列
4.设置过期标志更新缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值