commands

# OBJECT ENCODING 命令可以查看一个数据库键的值对象的编码
OBJECT ENCODING key0

延迟时间

 redis-cli --latency -h 192.168.50.100 -p 6379

sort

https://segmentfault.com/a/1190000002806846

基本使用 命令格式: SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE destination]

默认情况下,排序是基于数字的,各个元素将会被转化成双精度浮点数来进行大小比较,这是SORT命令最简单的形式,也就是下面这种形式:

SORT mylist

如果mylist是一个包含了数字元素的列表,那么上面的命令将会返回升序排列的一个列表。如果想要降序排序,要使用DESC描述符,如下所示:

SORT mylist DESC

如果mylist包含的元素是string类型的,想要按字典顺序排列这个列表,那么就要用到ALPHA描述符,如下所示:

watchdog

CONFIG SET watchdog-period 500

用户通过命令 CONFIG SET 开启软件看门狗

Redis 启动监测程序监测自己的状态

如果 Redis 检测到服务器被某些操作阻塞了,并运行速度不够快,也许是因为延迟导致的,Redis 就会在 log 文件中写入一份关于被阻塞服务器的底层监测数据报表

用户通过 Redis Google Group 发送消息给开发人员,消息包括看门狗报表。 时间间隔以毫秒为单位。在上面的例子中,我指定了,当服务器检测到 500 毫秒或更大的延迟的时候,才记录延迟事件。最小的时间间隔是 200 毫秒。

cluster

./redis-cli -p 7000 cluster nodes
./redis-cli -p 7000 CLUSTER FAILOVER
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
./redis-cli -p 7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
redis-cli --cluster del-node 127.0.0.1:7000 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
./redis-cli --cluster check 127.0.0.1:7000

DEBUG SEGFAULT

Redis Debug Segfault 命令执行一个非法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 调试。制造一次服务器当机。

redis 127.0.0.1:6379> DEBUG SEGFAULT 
redis-cli -p 7002 debug segfault

java sdk

  • redisson
  • jedis

查看版本等信息

info

version

current: 5.0.5
latest: 6.2

URLs

https://redis.io/
https://github.com/redis/redis

install

1
2
3
4
#centos
sudo yum install epel-release
yum install redis

rpm

download redis rpm from https://pkgs.org/download/redis

下载Redis的依赖包: libjemalloc

下载地址: https://pkgs.org/centos-6/atomic-x86_64/jemalloc-3.6.0-1.el6.art.x86_64.rpm.html

1
2
rpm -ivh jemalloc-3.6.0-1.el6.art.x86_64.rpm
rpm -ivh redis-2.8.20-3.el6.art.x86_64.rpm

ubuntu

sudo apt-get install redis-server

podman, 单机redis

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
podman run \
-d \
--name redis \
-p 6379:6379 \
-v /etc/localtime:/etc/localtime:ro \
redis:6.2.4

podman run -it --rm redis redis-cli -h redis.wiloon.com


podman run \
-d \
--name redis \
-p 6379:6379 \
-v /etc/localtime:/etc/localtime:ro \
-v redis-conf:/usr/local/etc/redis \
-v redis-data:/data/redis \
redis:6.2.4 redis-server /usr/local/etc/redis/redis.conf

1
redis-server --version

list all keys

keys *

delete key

del key1 key2

unlink key [key ...]

判断key是否存在

exists key_name

查看key的类型

type key0

删除 key

DEL key [key ...]

设置过期时间

EXPIRE key0 10

ttl: 返回给定 key 的剩余生存时间(TTL, time to live)

TTL key

查看各个库的key数量

info keyspace

以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。

可用版本: >= 1.0.0

时间复杂度: O(1)

返回值:

当 key 不存在时,返回 -2 。

当 key 存在但没有设置剩余生存时间时,返回 -1 。

否则,以秒为单位,返回 key 的剩余生存时间。

O(N) where N is the number of keys that will be removed. When a key to remove holds a value other than a string, the individual complexity for this key is O(M) where M is the number of elements in the list, set, sorted set or hash. Removing a single key that holds a string value is O(1).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
redis-cli -h 127.0.0.1 -p 6379

#cluster
redis-cli -c -h 127.0.0.1 -p 6379

# 不进入交互模式, 直接执行命令
redis-cli -h 127.0.0.1 -p 6379 hget key0 field0

client list
client kill ip:port

#查特定pattern的key 数量
redis-cli keys *xxx* |grep "" -c

批量删除Redis下特定pattern的keys
可以使用linux的xargs来做到如: 
*/redis-cli keys "prefix*" | xargs */redis-cli del 

如果是访问特定的数据库,则可以: 
*/redis-cli -n 0 keys "prefix*" | xargs */redis-cli -n 0 del

set set key0 value0 
get del key 
#delete key 

redis-server.exe 
redis.windows.conf 
redis-cli.exe

#当前数据库中key的数量 
DBSIZE

#清空当前数据库 
flushdb 

#info
# http://redisdoc.com/server/info.html

cluster

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
创建集群主节点

redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381
创建集群主从节点

/redis-cli --cluster create 192.168.163.132:6379 192.168.163.132:6380 192.168.163.132:6381 192.168.163.132:6382 192.168.163.132:6383 192.168.163.132:6384 --cluster-replicas 1

#  检查集群
redis-cli --cluster check 192.168.163.132:6384 --cluster-search-multiple-owners

# 集群信息查看
redis-cli --cluster info 192.168.163.132:6384
# 修复集群
redis-cli --cluster fix 192.168.163.132:6384 --cluster-search-multiple-owners
# 添加集群主节点

redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 
说明: 为一个指定集群添加节点,需要先连到该集群的任意一个节点IP(192.168.163.132:6379),再把新节点加入。该2个参数的顺序有要求: 新加入的节点放前
# 添加集群从节点

redis-cli --cluster add-node 192.168.163.132:6382 192.168.163.132:6379 --cluster-slave --cluster-master-id 117457eab5071954faab5e81c3170600d5192270
说明: 把6382节点加入到6379节点的集群中,并且当做node_id为 117457eab5071954faab5e81c3170600d5192270 的从节点。如果不指定 --cluster-master-id 会随机分配到任意一个主节点。

删除节点

redis-cli --cluster del-node 192.168.163.132:6384 f6a6957421b00009106cb36be3c7ba41f3b603ff
说明: 指定IP、端口和node_id 来删除一个节点,从节点可以直接删除,主节点不能直接删除,删除之后,该节点会被shutdown。
unlink key [key ...]

该命令和 DEL 十分相似:删除指定的key(s), 若key不存在则该 key 被跳过。但是,相比DEL会产生阻塞,该命令会在另一个线程中回收内存,因此它是非阻塞的。 这也是该命令名字的由来:仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。

释放 key 代价计算函数 lazyfreeGetFreeEffort(),集合类型键,且满足对应编码,cost就是集合键的元数个数,否则cost就是1. List:4.0只有一种编码,quicklist,所以编码无限制,直接返回element个数。 Set:非hash table编码,即intset编码时返回1.当一个集合只包含整数值元素, 并且这个集合的元素数量不多时, Redis 就会使用intset作为集合键的底层实现。 Hash:同上。     当hash键值满足下面任意条件编码为hash table: ->element count > “hash-max-ziplist-entries”,default 512. ->value length > “hash-max-ziplist-value”,default 64 Zset:非skiplist编码,返回1.    当zset键值满足下面任意条件编码为hash table: ->element count >"zset-max-ziplist-entries”,default 128 ->value length > “zset-max-ziplist-value”, default 64 举例: 1 一个包含100元素的list key, 它的free cost就是100 2 一个512MB的string key, 它的free cost是   总结: 不管是del还是unlink,key都是同步删除的。 使用unlink命令时,如果value分配的空间不大,使用异步删除反而会降低效率,所以redis会先评估一下free value的effort,根据 effort 的值来决定是否做异步删除。 使用unlink命令时,由于string类型的effort一直返回的是1,z所以string类型不会做异步删除。

作者:willcat 链接:https://juejin.cn/post/6844903810792423432 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

FLUSHALL

可用版本: >= 1.0.0 时间复杂度: O(N) 清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。

FLUSHALL ASYNC (Redis 4.0.0 or greater)

Redis is now able to delete keys in the background in a different thread without blocking the server. An ASYNC option was added to FLUSHALL and FLUSHDB in order to let the entire dataset or a single database to be freed asynchronously.

flushdb

执行删除在某个db环境下执行的话,只删除当前db的数据

module

 https://redis.io/modules

下载编译好的 redis module

 https://app.redislabs.com/

redis.conf 中使用 模块有两种加载方式,一是在配置文件 redis.conf 中使用

loadmodule /path/to/mymodule.so 在 Redis 启动时加载。

load a module at runtime

module load /data/redis/redisbloom.so

list modules

module list

卸载

MODULE UNLOAD bf

RedisBloom

https://oss.redislabs.com/redisbloom/

podman run -d -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest
BF.ADD newFilter foo
BF.EXISTS newFilter foo
BF.EXISTS newFilter bar
BF.MADD myFilter foo bar baz
BF.MEXISTS myFilter foo nonexist bar

https://github.com/redis/redis

Redis 响应延时问题排查

https://xie.infoq.cn/article/1ccbd30d94ab781a4f85ab2fc?utm_source=rss&utm_medium=article

RESP协议

什么是 RESP? 是基于TCP的应用层协议 RESP(REdis Serialization Protocol); RESP底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息,

Redis 的客户端和服务端之间采取了一种独立名为 RESP(REdis Serialization Protocol) 的协议,作者主要考虑了以下几个点:

容易实现

解析快

人类可读 RESP可以序列化不同的数据类型,如整数,字符串,数组。还有一种特定的错误类型。请求从客户端发送到Redis服务器,作为表示要执行的命令的参数的字符串数组。Redis使用特定于命令的数据类型进行回复。 RESP是二进制安全的,不需要处理从一个进程传输到另一个进程的批量数据,因为它使用前缀长度来传输批量数据。 注意:RESP 虽然是为 Redis 设计的,但是同样也可以用于其他 C/S 的软件。Redis Cluster使用不同的二进制协议(gossip),以便在节点之间交换消息。

关于协议的具体描述,官方文档 https://redis.io/topics/protocol

pipeline

可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。


https://mp.weixin.qq.com/s/MtvEf_jWWDb6yCXPqvqF0w

https://mp.weixin.qq.com/s/aOiadiWG2nNaZowmoDQPMQ