Redis 学习



linux下载:

  • 去redis官网,复制下载链接
  • cd 一个下载目录,然后 sudo wget http://....
  • 解压,并cd到软件根目录
  • sudo make
  • cd src ./redis-server ./redis-cli

也可以直接通过apt-get获取。

redis配置

通过redis-cli连接上server后:

CONFIG GET settingName         //通用格式

CONFIG GET loglevel            //具体实例

CONFIG GET *                   //获取所有配置项

修改方式
①通过redis.conf文件进行修改。

②在连接里,用CONFIG set命令修改。

> CONFIG SET settingName new_attribute_valuel         //通用格式

> config set loglevel "notice"                        //实例

部分参数说明请拖到最下方。

Redis 数据类型

说明:Redis数据库必然有数据存入,可以存入库中的数据的类型是确定的。

更详细的命令操作,请看后文。

String:

  • [>SET key "value" >GET key ] 建立一个普通的string。一个键最大能储存512MB ,有空格时记得将value放在“”中

Hash:

  • [>HMSET field "value" field2 "value2" ... >HGET fieldx ] 建立一个hash表,用于储存多个键值对,可以储存40亿对。

List:

  • [>lpush listName value >lpush listName value2 >lpush listName value2 ... ]一个listName中可以放多个值。取值方式如下:
  • [>lrange listName 0 5 ] 得到listName中0~5的六个值。注意:lpush采取的是首部插入方式。

Set:

  • [>sadd setName menber1 >sadd setName menber2 >... ] 在一个集合中,放入数值。
  • [>smembers setName] 得到setName集合中的元素。(元素唯一不重复)

zset(sorted set:有序集合)

  • [>zadd zsetName position member >zadd zsetName posiziton(2) member2 >... ]建立一个有序集合,添加时设置元素的位置。
  • [>zrangebyscore zsetName startPosi endPosi ] 得到zsetName集合中,startPosi到endPosi的元素。

Redis 命令

当客户端连入redis-server后,即可执行redis命令操作。

当要在远程redis服务器上执行命令时:

> ./redis-cli  -h  host  -p  port  -a  password
> ping
> PONG    //当连接成功后,输入ping,会显示这个。

Redis 键-KEY

基本语法:(包括上述说的几种数据类型的存入、查看命令)

> command  keyName

如下是基本命令:

  • DEL key :删除key,其可以是string名、hash名、set名等等。

  • DUMP key : 序列化给定的key,并返回被序列化的值。(16进制格式)

  • EXISTS key :检查key是否存在。

  • EXPIRE key seconds :设置key的过期时间(秒,必须是整数)。

    • EXPIREAT key timestamp :功能同上,但是设置的过期时间是以时间戳为主,1970.1.1后的秒计数。

    • PEXPIRE key milliseconds :功能相同,但是过期时间为毫秒。

    • PEXPIRE key timestamp :功能相同,但是时间戳的单位为毫秒。

  • PERSIST key :移除过期时间,让key长久保持。

  • TTL key : 以秒为单位,返回key的剩余过期时间,

    • PTTL key :以毫秒为单位,返回key的剩余过期时间。
  • RANDOMKEY :从当前数据库中随机返回一个key。

  • KEYS pattern :查找所有复合给定模式(pattern)的key。

  • MOVE key dataBase:将当前数据库的key,移动到dataBase中。

  • RENAME key newKey :修改key的名字

    • RENAMENX key newkey :只有在newkey不存在时,才修改key的名字。
  • TYPE key : 返回key所储存的值的类型。


String 相关命令

  • SET key value
    • SETEX key seconds value :建立String,并设置过期时间。
    • SETNX key value :只有在key不存在时才创建String
    • MSET key value key2 value2... :同时建立多个String
    • MSETNX key value key2 value2 ... :当且仅当所有的key都不存在时,才建立,否则都不创建String
  • GET key
    • MGET key1 key2 :同时得到多个String的值。
  • GETRANGE key start end : 返回子字符串
  • STRLEN key :返回字符串大小。
  • GETSET key value :将给定key的值设为value,并返回旧值。
  • SETRANGE key offset value:用value覆盖key中offset开始的字符串值。(offset是以char为单位)
  • GETBIT key offset :得到String的二进制流中,偏移为offset的bit位。
  • SETBIT key offset 0/1 :
  • MGET key1 key2 ... :得到一个或多个给定的key的值。
  • INCR key :将key里的值+1;(字符串必须完全为整数)
  • INCRBY key increment :将key中的值加上increment增量。
    • INCRBYFLOAT key increment :将key中的值加上浮点增量值。(increment可以为浮点数或整数)
  • APPEND key value :如果key已经存在并且是一个字符串,将value追加到其末尾。否则新建key。

more :https://redis.io/commands


Redis Hash相关

说明:很适合储存对象。作为包含了多个键值对的hash表。

  • HSET key field value :建立一张哈希表,并放入键值对。
    • HMSET key field1 value field2 value2... :建立一张哈希表,并放入多个键值对。
    • HSETNX key field value :只有在字段不存在时,才将该键值对放入哈希表中。
  • HGET key field :得到key表中field字段的值。
    • HGETALL key :得到key表中的所有:字段及其值。
    • HGMGET key field1 field2... :获取key表中指定字段的值。
  • HVALS key :获取key表中所有值(不包括键名)。
  • HKEYS key :获取key hash表中的所有字段。
  • HDEL key field1 field2... :删除key表中的field1、field2...等键值对
  • EXISTS key field :查看key表中是否存在field。
  • HINCRBY kye field increment :为kye表中的字段field的值,加上一个increment增量。
    • HINCRBYFLOAT kye field increment :为kye表中的field字段的值,加上一个浮点数的增量。
  • HLEN key :获取key表中的字段数量。
  • HSCAN key cursor [MATCH pattern] [COUNT count] :迭代哈希表中的键值对

more:https://redis.io/commands


Redis List列表相关

  • LPUSH key value1 value2... :将value1、2等多个值顺序插入到key列表首部。(顺序相反)

    • RPUSH key value1 value2.... :将value1、2等多个值顺序插入到key列表的尾部。(顺序相同)

    • LPUSHX key value1 :将 一个值顺序插入到key列表首部。(和上面完全相同)

    • LINSERT key BEFORE|AFTER pivot value :(pivot,中心点轴点;在这里对应列表中已有值)将value插入到key列表中的pivot值前/后面。

  • LSET key index value :key[index]=value;

  • LINDEX key index :通过index获取key列表中的值。

    • LRANGE key start end :得到key列表中从start到end索引的元素。
  • LPOP key :移出并获取列表的首元素。

    • RPOP key :移出并返回列表的末元素。

    • RPOPLPUSH source destination :移出source列表的末元素,并插入destination列表的首部。

    • BLPOP key1 key2... timeout :移出多个列表的首元素,如果某个列表没有元素则会阻塞列表,知道等待超时或发现可弹出元素为止。

    • BRPOP key1 key2... timeout :与上述同,只是移出的是尾元素(右元素)。

    • BRPOPLPUSH source destination timeout :从source列表中弹出一个值,并将其放置到destination列表的首部,如果没有元素则会阻塞,并等待超时或发现可弹出元素为止。

  • LTRIM key start stop :(trim,裁剪)裁剪key列表,保留[start]~[stop]区间的元素,其他的都删除。

  • LLEN key :得到列表长度。


Redis set集合

序号 命令及描述
1 [SADD key member1 member2] 向集合添加一个或多个成员
2 SCARD key 获取集合的成员数
3 [SDIFF key1 key2] 返回给定所有集合的差集
4 [SDIFFSTORE destination key1 key2] 返回给定所有集合的差集并存储在 destination 中
5 [SINTER key1 key2] 返回给定所有集合的交集
6 [SINTERSTORE destination key1 key2] 返回给定所有集合的交集并存储在 destination 中
7 SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8 SMEMBERS key 返回集合中的所有成员
9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10 SPOP key 移除并返回集合中的一个随机元素
11 [SRANDMEMBER key count] 返回集合中一个或多个随机数
12 [SREM key member1 member2] 移除集合中一个或多个成员
13 [SUNION key1 key2] 返回所有给定集合的并集
14 [SUNIONSTORE destination key1 key2] 所有给定集合的并集存储在 destination 集合中
15 [SSCAN key cursor MATCH pattern] [COUNT count] 迭代集合中的元素

Redis sorted set有序集合

序号 命令及描述
1 [ZADD key score1 member1 score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key 获取有序集合的成员数
3 ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5 [ZINTERSTORE destination numkeys key key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7 [ZRANGE key start stop WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8 [ZRANGEBYLEX key min max LIMIT offset count] 通过字典区间返回有序集合的成员
9 [ZRANGEBYSCORE key min max WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10 ZRANK key member 返回有序集合中指定成员的索引
11 [ZREM key member member ...] 移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15 [ZREVRANGE key start stop WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16 [ZREVRANGEBYSCORE key max min WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member 返回有序集中,成员的分数值
19 [ZUNIONSTORE destination numkeys key key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 [ZSCAN key cursor MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

Redis HyperLogLog

说明:

序号 命令及描述
1 [PFADD key element element ...] 添加指定元素到 HyperLogLog 中。
2 [PFCOUNT key key ...] 返回给定 HyperLogLog 的基数估算值。
3 [PFMERGE destkey sourcekey sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog

Redis 发布订阅通信模式

模式:发送方(publisher)发送消息——订阅者(subscriber)接收消息。

示意图如下:

①多个客户端订阅频道channel1:


0.jpg

②当channel1收到PUBLISH消息时,会发送给所有订阅客户端:

1.jpg

基本命令:

  • **> SUBSCRIBE ** channel1 channel2... :订阅channel1、2等频道,并进入等待消息模式。

  • > PUBLISH channel “...message...” :将信息发送到channel频道。

说明:上述中订阅者将会处于监听状态,其可以随时退出。发布者发布的消息只能由正在监听的订阅者收到。

常用命令

  • PSUBSCRIBE pattern1 pattern2... :订阅一个或多个符合给定模式的频道。

  • PUBSUB subcommand arg1 arg2... :查看订阅-发行系统的状态。

    subcommand包括:

    • CHANNELS [pattern] : 查看当前订阅发行系统中,正在被客户端监听的(pattern模式)频道。pattern可不写。
    • NUMPAT :查看模式的订阅数量。
    • NUMSUB channel1 channel2 :查看订阅channel1、2等各个频道的客户端数量。
  • PUNSUBSCRIBE pattern1 pattern2... :退订所有给定模式的频道。

  • UNSUBSCRIBE channel1 channel2.. :退订给定的频道。


Redis 事务

说明:一个事务可以一次执行多个命令,并保证:(事务非原子操作)

  • 批量操作在发送EXEC命令前放入队列缓存。
  • 收到EXEC命令后进入事务执行,并当某个命令执行失败时,不会影响别的命令执行。
  • 执行中不会被其他命令请求插入事务执行序列。

过程:①开始事务(MULTI) ②命令入列 ③执行事务(EXEC)

实例:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET myString "no!it's this!"
QUEUED
127.0.0.1:6379> GET myString
QUEUED
127.0.0.1:6379> append myString "  ok!you are right~"
QUEUED
127.0.0.1:6379> get myString
QUEUED
127.0.0.1:6379> exec
1) OK
2) "no!it's this!"
3) (integer) 32
4) "no!it's this!  ok!you are right~"
127.0.0.1:6379> 

事务相关命令:

  • DISCARD :取消事务,放弃其内所有的命令。(discard,v,n.抛弃。)
  • WATCH key key2... :监视一个或多个key,如果事务执行前他们发生了改动,那么事务将被打断。只能在事务进行前进行watch,且只是一次性。本次事务执行后,会默认没有监视。
  • UNWTACH :取消对所有key的监视。

Redis 脚本

说明:Redis使用lua解释器来执行脚本。常用命令为EVAL

  • EVAL script numkeys key key2... arg1 arg2... :执行脚本script,numkeys:所用的key的数量。
  • SCRIPT EXISTS script script2... :查看脚本一个或多个script是否已经在缓存中了。
  • SCRIPT FLUSH :从脚本缓存中移除所有缓存。
  • SCRIPT KILL :关闭当前正在运行的lua脚本
  • **SCRIPT LOAD **script :将script脚本添加到脚本缓存中,但并不立即执行该脚本。

Redis 连接命令

说明:主要用于连接redis服务器。

  • AUTH password :验证密码是否正确
  • ECHO message :打印字符串
  • PING :查看服务器是否运行。
  • QUIT :关闭当前连接。
  • SELECT index :切换到指定数据库。

Redis 服务器相关命令

说明:主要用于管理服务器。

数据备份和恢复:(持久化)

  • SAVE :储存当前数据库的备份到磁盘。该命令将在redis安装目录创建:dump.rdb
    • SAVE seconds count(of keys changed) :在seconds之后判断,此间是否有count个key发生改变,如果发生,则生成快照(触发bgsave命令)
  • BGSAVE :同上,区别在于后台处理。
  • CONFIG GET DIR :获取redis安装目录

恢复数据只需要将dump.rdb移动到 redis安装目录并启动服务即可。

说明:Redis有两种数据存储方式:

  • ①snapshot快照:Redis的默认模式,储存当前数据库的备份,可以用于多台服务器同步。

  • ②AOF(append-only file,只追加文件):想必快照更具实时性,是目前常用的模式。

    配置命令:config set appendonly yes

    详细:开启AOF持久化后,没执行一条修改Redis数据的命令,就会将其写入磁盘中的appendonly.AOF文件(位置与dump.rdb相同)。

    三种方式:

    appendfsync always    #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
    appendfsync everysec  #每秒钟同步一次,显示地将多个写命令同步到硬盘(通常选择)
    appendfsync no        #让操作系统决定何时进行同步
    

more:https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/Redis/Redis.md#redis-%E6%8C%81%E4%B9%85%E5%8C%96%E6%9C%BA%E5%88%B6%E6%80%8E%E4%B9%88%E4%BF%9D%E8%AF%81-redis-%E6%8C%82%E6%8E%89%E4%B9%8B%E5%90%8E%E5%86%8D%E9%87%8D%E5%90%AF%E6%95%B0%E6%8D%AE%E5%8F%AF%E4%BB%A5%E8%BF%9B%E8%A1%8C%E6%81%A2%E5%A4%8D

EXCEPTION

异常:之前出现了异常,是因为输入了> save命令,log:"MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk”。

解决方式:

  • config set stop-writes-on-bgsave-error no
  • /etc/sysctl.conf 添加语句:vm.overcommit_memory=1

详细:https://blog.csdn.net/xc_zhou/article/details/80893326


设置密码

  • CONFIG get requirepass :查询是否设置了密码。

  • CONFIG SET requirepass password :设置密码。当以后在本机登录时,可以仅输入./redis-cli -a password。

    设置密码后,就必须要用密码验证,否则无法执行命令。

  • AUTH password :验证密码。


主从复制

说明:将一台服务器的数据,复制同步到其他服务器的过程。只能单向由主服务器(master)→从服务器(slave)。Redis主从复制支持:主从同步从从同步。从从同步可以减轻主节点负担。

作用:

  • (对外)负载均衡:将客户请求分为读和写。主节点提供写请求、从节点提供读请求等方法均衡。
  • (对内)数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • (对内)故障修复:当主服务器出现故障时,可以让从服务器处理请求。
  • Redis高可用的基础:除上述外,主从复制还是Redis哨兵和集群实施的基础。

实现方法:

  • CONFIG 文件配置:在 从服务器 的配置文件中加入:slaveof [master ip] [master port]
  • 启动时命令:启动时:> ./redis-server --slave [master ip] [master port]
  • 客户端命令:在./redis-cli中直接输入:> slaveof ip port //让该服务器成为从节点。

说明:主从复制的开启,是由从节点发起,不需要在主节点做任何操作。

配对:通过在 主节点 配置 requirepass 来设置密码,这样就必须先在从节点 中对应配置好 masterauth 参数 (与主节点 requirepass 保持一致) 才能够进行正常复制了。

实例

①本地启动多个节点:可以通过./redis-server --port id实现。

多个Redis服务器建立后,都默认为主节点。

②建立复制:客户端登录一个节点> ./redis-cli -p portId

再输入:> slaveof host port 即可建立主从关系。

③配置文件:主节点中,配置文件默认从节点的客户端只能读不能写。

④断开复制:从节点中 > slaveof no one即可

2.png

Redis 性能测试

基本命令:redis-benchmark [option] [option value] //benchmark:基准,标准检查程序。

注意:在目录下执行,而非在redis客户端内执行。

实例:

./redis-benchmark -n 100000 -q
PING_INLINE: 152207.00 requests per second
PING_BULK: 148148.14 requests per second
SET: 145348.83 requests per second
GET: 151057.41 requests per second
INCR: 143061.52 requests per second
LPUSH: 142045.45 requests per second
RPUSH: 146842.88 requests per second
LPOP: 145560.41 requests per second
RPOP: 143678.17 requests per second
SADD: 141643.06 requests per second
HSET: 145137.88 requests per second
SPOP: 140646.97 requests per second
LPUSH (needed to benchmark LRANGE): 142247.52 requests per second
LRANGE_100 (first 100 elements): 129366.11 requests per second
LRANGE_300 (first 300 elements): 126582.27 requests per second
LRANGE_500 (first 450 elements): 134228.19 requests per second
LRANGE_600 (first 600 elements): 130208.34 requests per second
MSET (10 keys): 142450.14 requests per second

option如下:

序号 选项 描述 默认值
1 -h 指定服务器主机名 127.0.0.1
2 -p 指定服务器端口 6379
3 -s 指定服务器 socket
4 -c 指定并发连接数 50
5 -n 指定请求数 10000
6 -d 以字节的形式指定 SET/GET 值的数据大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
9 -P 通过管道传输 <numreq> 请求 1
10 -q 强制退出 redis。仅显示 query/sec 值
11 --csv 以 CSV 格式输出
12 -l 生成循环,永久执行测试
13 -t 仅运行以逗号分隔的测试命令列表。
14 -I Idle 模式。仅打开 N 个 idle 连接并等待。

Redis 客户端连接

连接步骤:

①当客户端连接上服务器的监听端口或套接字后,服务器首先设置其socket为非阻塞。

②服务器设置属性:TCP_NODELAY。禁用Nagle算法。

③然后创建一个可读的文本事件用于监听这个客户端socket的数据发送.

相关命令:

S.N. 命令 描述
1 CLIENT LIST 返回连接到 redis 服务的客户端列表
2 CLIENT SETNAME 设置当前连接的名称
3 CLIENT GETNAME 获取通过 CLIENT SETNAME 命令设置的服务名称
4 CLIENT PAUSE milliseconds 挂起客户端连接,指定挂起的时间以毫秒计
5 CLIENT KILL option value 关闭客户端连接(option和value是一对,skipme yes为自杀)

Redis 管道技术

说明:redis的客户端和服务器是client-server模型、请求-响应模型。管道技术用于redis客户端在服务器未响应时,可以继续向服务器发送请求。(redis客户端发送完请求会进入阻塞等待状态),并最终一次性读取服务器响应数据。

实例

ubuntu@ubuntu-0:/opt/redis-5.0.5/src$ (echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
+PONG
+OK
$5
redis
:1
:2
:3

作用:提高性能

runoob的测试例子:

require 'rubygems' 
require 'redis'
def bench(descr) 
start = Time.now 
yield 
puts "#{descr} #{Time.now-start} seconds" 
end
def without_pipelining 
r = Redis.new 
10000.times { 
    r.ping 
} 
end
def with_pipelining 
r = Redis.new 
r.pipelined { 
    10000.times { 
        r.ping 
    } 
} 
end
bench("without pipelining") { 
    without_pipelining 
} 
bench("with pipelining") { 
    with_pipelining 
}
//从处于局域网中的Mac OS X系统上执行上面这个简单脚本的数据表明,开启了管道操作后,往返延时已经被改善得相当低了。
//输出如下
without pipelining 1.185238 seconds 
with pipelining 0.250783 seconds

Redis 分区

说明:将数据分割到多个Redis实例。

优势

  • 可利用多台计算机内存和cpu,构造更大的数据库。
  • 通过多台计算机cpu、网络适配器,拓展计算能力和带宽等。

不足

  • 通常不支持涉及多个key的操作。如对映射在两个Redis实例的set进行取交集。
  • 不支持涉及多个key的Redis事务
  • 数据处理较复杂,及备份持久化文件。
  • 增加、删除容量也比较复杂。Redis集群大多数支持在运行时增加、删除节点的透明数据平衡能力。但类似于客户端分区、代理等其他系统则不支持这项特性。

分区方法

设Redis实例为R0、R1、R2、R3。用key来表示多个用户:key1、key2、key3...

  • 范围分区:通过设置id的范围来进行分区。如将key=010000的用户放在R0、1000120000放在R1等。但其需要一个映射表,且需要被管理,同时需要各种对象的映射表,通常不是好方法。
  • 哈希分区:先通过某种hash函数进行映射成整数,然后将整数对Redis实例数%取模。

更多服务器命令:

序号 命令及描述
1 BGREWRITEAOF 异步执行一个 AOF(AppendOnly File) 文件重写操作
2 BGSAVE 在后台异步保存当前数据库的数据到磁盘
3 CLIENT KILL ip:port ID client-id 关闭客户端连接
4 CLIENT LIST 获取连接到服务器的客户端连接列表
5 CLIENT GETNAME 获取连接的名称
6 CLIENT PAUSE timeout 在指定时间内终止运行来自客户端的命令
7 CLIENT SETNAME connection-name 设置当前连接的名称
8 CLUSTER SLOTS 获取集群节点的映射数组
9 COMMAND 获取 Redis 命令详情数组
10 COMMAND COUNT 获取 Redis 命令总数
11 COMMAND GETKEYS 获取给定命令的所有键
12 TIME 返回当前服务器时间
13 COMMAND INFO command-name command-name ...获取指定 Redis 命令描述的数组
14 CONFIG GET parameter 获取指定配置参数的值
15 CONFIG REWRITE 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
16 CONFIG SET parameter value 修改 redis 配置参数,无需重启
17 CONFIG RESETSTAT 重置 INFO 命令中的某些统计数据
18 DBSIZE 返回当前数据库的 key 的数量
19 DEBUG OBJECT key 获取 key 的调试信息
20 DEBUG SEGFAULT 让 Redis 服务崩溃
21 FLUSHALL 删除所有数据库的所有key
22 FLUSHDB 删除当前数据库的所有key
23 INFO section 获取 Redis 服务器的各种信息和统计数值
24 LASTSAVE 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
25 MONITOR 实时打印出 Redis 服务器接收到的命令,调试用
26 ROLE 返回主从实例所属的角色
27 SAVE 同步保存数据到硬盘
28 SHUTDOWN [NOSAVE] [SAVE] 异步保存数据到硬盘,并关闭服务器
29 SLAVEOF host port 将当前服务器转变为指定服务器的从属服务器(slave server)
30 SLOWLOG subcommand [argument] 管理 redis 的慢日志
31 SYNC 用于复制功能(replication)的内部命令

缓存三大问题

①缓存穿透

说明:查询数据库和缓存都没有的数据。

解决方法

  • 缓存空对象:代码简单、效果不好。解决的是一个不存在的key多次访问的问题。

  • 布隆过滤器:代码复杂,效果很好。

布隆过滤器

2.jpg

3.jpg

②缓存击穿

说明:数据库有数据,缓存中没有。对热点数据的高并行多线程访问。结果:数据库容易崩掉

原因:

  • 数据没被访问过。(没影响,不算击穿)
  • 数据刚好失效。(通常是redis过期了)

解决方法:写一个方法内部锁,形式:访问redis,内部锁,再次访问redis,查询数据库。(只有第一个线程会访问r数据库,其他都访问redis。

③缓存雪崩问题

说明:数据库同时被超高并行线程访问,容易崩掉。

原因:

  • redis挂了
  • 大部分数据失效(可能是设置的时间过期了)

解决方法:

  • 预防:redis搭建高可用集群(cluster),错开数据过期时间。
  • 出现雪崩解决:降级 熔断。(微服务知识)

数据库、缓存一致性问题

redis cluster高可用集群

6.jpg

一线厂的会深入问的

下图:4、

7.jpg

设置参数说明

1:daemonize:redis默认不以守护进程方法运行,可以通过该配置项修改,用yes启动或no关闭守护进程

2:pidfile :当以守护进程运行时,Redis会将pid写入/var/run/redis.pid,可以通过pidfiel配置指定目录。

3:port 6379:默认Redis-server监听6379.可以修改。

4:bind 127.0.01:绑定的主机地址。

5:timeout 300:指定客户端闲置最大时间,超过则断开连接。指定为0,则关闭该功能。

6:loglevel:总共支持四个级别:debug,verbose、notice、warning。默认:notice;

更多配置查看官网或者https://www.runoob.com/redis/redis-conf.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342