Hello World

Your description here.

redis 笔记

默认分类 3 评

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常用

  1. 添加 set key value
  2. 取值 get key
  3. 批量 mset key value []
  4. 自增 incr key
  5. 自减 decr key
  6. 自增指定数量 incrby key increment
  7. 自减指定数量 decrby key increment
  8. setex 设定值的时候指定生存时间 setex key second value
  9. setnx key value key存在,什么事不做
  10. append key value
  11. strlen key 查看value字符串长度

3.2 hash

  1. 存储数据 hset key field value
  2. 获取数据 gset key field
  3. 批量操作 hmset key field value field value hmget key field field
  4. 自增 hincreby key field increment
  5. key-field存在就什么都不做 hsetnx key field value
  6. 检查field是否存在 hexist key field
  7. 删除key对应的field(多个) hdel key field field2
  8. 获取当前hash全部的field和value hgetall key
  9. 获取当前hash全部field hkeys key
  10. 获取所有value hvals key
  11. 获取field数量 hlen key

3.4 list

  1. 存储数据(左侧)lpush key value value
  2. 右侧 rpush key value value
  3. key不存在或者不是list结构什么都不做,不能批量操作 lpushx key value rpushx key value
  4. 指定位置存储(覆盖,index超出会失败) lset key index value
  5. 弹栈获取数据 ,数据会被移除 lpop rpop key
  6. 获取指定索引范围数据 lrange key start(0开始)stop(-1倒数第一)
  7. 指定索引位置的数据 lindex key index
  8. 获取长度 llen key
  9. 删除列表(删除count个value,count>0 左侧向右侧,count<0右侧到左侧,count===0删除所有) lrem key count value
  10. 保留指定范围的数据,其余删除 ltrim key start stop
  11. 将一个列表中最后的一个数据插入到另外一个列表头部位置 rpoplpush list1 list2

3.5 set

无序,不允许重复

  1. 存储数据 sadd key member member
  2. 获取数据 smember key
  3. 随机获取数据 spop key [count]
  4. 交集命令 sinter set1 set2 ...
  5. 并集 获取全部集和中的数据 sunion set1 set2 . . .
  6. 差集 sdiff set1 set2
  7. 删除数据 srem key member member
  8. 查看当前集和是否有某个值 sismember key member

3.6 zset

有序,不允许重复

  1. 添加数据 zadd key score member score member(score必须为数值,member不允许重复)
  2. 修改member分数 zincrby key score member(member存在正常加分数,若不存在,相当于zadd)
  3. 查看指定member分数 zscore key member
  4. 获取zset中数据数量 zcard key
  5. 查询一定分数范围的member数量 zcount key min max
  6. 删除zset zrem key member member
  7. 根据分数从小到大排序,获取指定范围内的数据(widthscore如果添加这个参数,会返回member对应的分数)zrange key start stop [witthscore]
  8. 根据分数从大到小排序,获取指定范围内的数据(widthscore如果添加这个参数,会返回member对应的分数)zrevrange key start stop [withscore]
  9. 根据分数的返回去获取数据(widthscore表示同时返回score) zrangebyscore key min max [withscore] [limit offset count] (不等于 采用( 相当于 <)(最大值+inf 最小值-inf)
  10. 根据分数的返回去获取数据(widthscore表示同时返回score) zrangebyscore key max min [withscore] [limit offset count]

3.7 key常用命令

  1. 查看Redis中的全部key(pattern:*)keys pattern
  2. 查看某一个key是否存在(1 key存在,0 key不存在)exits key
  3. 删除key del key key
  4. 设置key的生存时间,单位为秒、毫秒 expire key second pexpire key milliseconds
  5. 设置key生存时间到固定时间点 expireat key timestamp pexpireat key milliseconds
  6. 查看key剩余生存时间,单位为秒、毫秒 ttl key pttl key(-2 当前key不存在,-1当前key没有剩余生存时间)
  7. 移除key的生存时间 persist key(1 移除成功,0 可以不存在时间或者key不存在)
  8. 选择操作的库 select 0~15
  9. 将key移动到另外一个库中 move key db

3.8 库的常用操作

  1. 清空当前所在的库 flushdb
  2. 清空所有数据库 flushall
  3. 当前数据库key个数 dbsize
  4. 查看最后一次操作的时间 lastsave
  5. 实时接收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 666
redis 127.0.0.1:6379> AUTH PASSWORD

方式二:在第一次Redis时输入 Config set requirepass

5.2 Redis持久化机制

RDB是默认的持久化机制

  1. RDB持久化文件,速度快,二进制,传输方便
  2. 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

  3. RDB无法保持数据的绝对安全

5.3Redis事务

Redis的事务:一次事务操作,改成功的成功,失败的失败。

先开启事务,执行一些列的命令,但是密码不会立即执行,会被放在一个队列中,如果执行事务,那么这个队列的命令全部执行,如果取消队列,则全部取消。

  1. 开启事务:multi
  2. 输入需要执行的命令,被放在一个队列中
  3. 执行事务:exec
  4. 取消事务:discard

Redis的事务可配上watch监听机制

在开启事务之前,先通过watch监听一个或多个key,开启事务后若其他客户端修改了我监听的key,事务会自动取消。

执行了事务或取消了事务,watch自动消除,不需要unwatch

5.4 AOF持久化策略

  1. AOF持久化机制默认关闭,官方推荐同时开启的RDB和AOF,更安全避免数据丢失。
  2. Redis 的持久化方式之一 RDB 是通过保存数据库中的键值对来记录数据库的状态。而另一种持久化方式 AOF 则是通过保存 Redis 服务器所执行的写命令来记录数据库状态。
  3. 相对RDB慢,存储的是个文本文件,后期文件会大,传输困难。
  4. 参数:

    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,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;

    1. 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 6379

5.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存储数据的能力

特点:

  1. 无中心
  2. ping-pang通讯
  3. 投票机制,数量必须为2n+1
  4. 默认分配16384个hash槽,在存储数据时会对key进行crc16的算法,并且对16384取余,根据结果存放到节点中。
  5. 为保持数据的安全,每个集群的节点至少跟着一个从节点

image-20200827181210127.png

#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会立即删除吗?

不会立即删除。

  1. 定期删除

    Redis每隔一段时间会去查看Redis设置了过期时间的key,会100ms间隔中默认查看3个key。

  2. 惰性删除

    如果查看一个已经过了生存时间的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的访问添加限制

image-20200827220226396

缓存击穿

缓存中的热点数据突然到期,造成请求都去访问数据库,造成数据库宕机

1.在访问缓存中没有的时候,添加一个锁,让几个请求访问数据库,避免数据库宕机

2.热点数据生存时间去掉

缓存雪崩

大量缓存同时到期,最终大量的请求都去数据库

1.缓存设置随机时间,30-60分钟

缓存倾斜

热点数据放在一个redis节点上,redis无法承受大量请求,最终宕机

1.扩展主从架构,搭建大量从节点,环节redis压力

2.可在tomcat中做jvm缓存,在查询redis前先去查询tomcat中缓存
image-20200827220226396.png

shell
3 评论
    rxqzzrstoaSogo BrowserWindows 10
    10月7日回复

    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

    11月1日回复

    华纳东方明珠客服电话是多少?(▲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╃】

    11月21日回复

    寻找华纳圣淘沙公司开户代理(183-8890-9465薇-STS5099】

    华纳圣淘沙官方合作开户渠道(183-8890-9465薇-STS5099】

    华纳圣淘沙公司开户代理服务(183-8890-9465薇-STS5099】

    华纳圣淘沙公司开户咨询热线(183-8890-9465薇-STS5099】

    联系客服了解华纳圣淘沙开户

    (183-8890-9465薇-STS5099】
    华纳圣淘沙公司开户专属顾问

    (183-8890-9465薇-STS5099】