子嘉的博客 子嘉的博客
首页
bic-bic
技术
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

高子嘉

没有比脚更长的路,没有比人更高的山
首页
bic-bic
技术
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 技术文档

  • GitHub技巧

  • 博客搭建

  • 服务端

  • distributed

  • golang

  • db

    • mysql

      • mysql
      • password
      • dead_lock
      • mariadb password
      • script
      • dump
    • mongodb

    • redis
      • 1. 从测试命令开始学习
        • 1.6 哈希命令
      • 2. HyperLogLog 基数统计
      • 3. 发布订阅(pub/sub)
      • 4. 事务
      • 5. Redis 脚本
      • 6. Redis 连接
      • 7. Redis 服务器
      • 8. Redis 数据备份和恢复
      • 9. 管道和分区技术
  • docker

  • linux

  • 技术
  • db
子嘉
2022-06-04
目录

redis

# redis

Redis 是一个 key-value 存储数据结构服务器,是一个开源的使用 ANSI C 语言编写的,遵守 BSD 协议,支持网络可基于内存亦可持久化的日执行,key-value 数据库,并提供多种语言的 API。支持存储的值可以是字符串(string),哈希(hash),列表(list),集合(set),有序集合(sorted sets)。redis 有着复杂的数据结构并且提供对他们的原子操作。

相关资源: Redis 官网 (opens new window) Redis 在线测试 (opens new window)

# 1. 从测试命令开始学习

redis 性能测试的基本命令如下

redis-benchmark [option] [option value]
1

该命令在 redis 目录下执行,而不是在 redis 客户端内执行。以下示例同时执行 10000 个请求来检测性能

$ redis-benchmark -n 10000 -q

PING_INLINE: 22727.27 requests per second
PING_BULK: 24390.24 requests per second
SET: 23809.52 requests per second
GET: 21739.13 requests per second
INCR: 23809.52 requests per second
LPUSH: 21276.60 requests per second
RPUSH: 24390.24 requests per second
LPOP: 21739.13 requests per second
RPOP: 55555.56 requests per second
SADD: 20000.00 requests per second
HSET: 24390.24 requests per second
SPOP: 23809.52 requests per second
LPUSH (needed to benchmark LRANGE): 21739.13 requests per second
LRANGE_100 (first 100 elements): 16949.15 requests per second
LRANGE_300 (first 300 elements): 7575.76 requests per second
LRANGE_500 (first 450 elements): 6993.01 requests per second
LRANGE_600 (first 600 elements): 5076.14 requests per second
MSET (10 keys): 19230.77 requests per second
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

从检测性能的命令上来学习 redis,PING命令用于测试服务端连接。redis 将返回 PONG。inline 和 bulk 区别,两者是相对于 redis 序列化协议(REdis Serialization Protocol, RESP)来说的 inline 就是一个单行,以空格来分隔命令的使用方式。例如在没有 redis-cli 的时候可以使用 telnet 命令临时代替操作。操作命令即 telnet ip 6379。另外当使用 redis 客户端或自己实现 redis 客户端的时候就会同时发送多行命令,RESP 使用 \r\n 来分割命令并且还会涉及到其他的特殊标记符号。

  1. 键管理命令 SET、GET 命令等用于管理 redis 的键,相关的命令还有 DEL DUMP EXISTS EXPIRE EXPIREAT PEXPIRE PEXPIREAT KEYS MOVE PERSIST PTTL TTL RANDOMKEY RENAME RENAMENX TYPE

  2. 字符串和值命令 INCR、MSET 字符串(String)和值(value)操作命令。相关的命令还有 GETRANGE GETSET GETBIT MGET SETBIT SETEX SETNX SETRANGE STRLEN MSET MSETNX PSETEX INCR INCRBY INCRBYFLOAT OECR OECRBY APPEND

  3. 列表操作命令 LPUSH、RPUSH、LPOP、RPOP 列表(list)操作的命令,命令的含义基本就是字面意思了。相关的命令还有 BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSHX LRANGE LREM LSET LTRIM RPOP RPOPLPUSH RPUSHX

  4. 集合命令 SADD、SPOP 集合(set)操作的命令,这是一个无序集合,使用迭代功能时要注意。相关的命令还有 SCARD SDIFF SDIFFSTORE SINTER SINTERSTORE SISMEMBER SMEMBERS SMOVE SRANDOMEMEMBER SREM SUNION SUNIONSTORE SSCAN

  5. 有序集合命令 集合分无序集合(set)和有序集合(sorted set),上面的操作针对于无序集合。有序集合的操作命令有 ZADD ZCARD ZCOUNT ZINCRBY ZINTERSTORE ZLEXCOUNT ZRANGE ZRANGEBYLEX ZRANGEBYSCORE ZRANK ZREM ZREMRANGEBYLEX ZREMRANGEBYRANK ZREMRANGEBYSCORE ZREVRANGE ZREVRANGEBYSCORE ZREVRANK ZSCORE ZUNIONSTORE ZSCAN

可以看到有序集合支持众多复杂的操作,在应用中可以利用有序集合的排序能力做排行榜功能。

# 1.6 哈希命令

HSET 哈希(Hash)操作。哈希是无序的,在使用迭代功能的时候要注意。相关命令还有 HDEL HEXIESTS HGET HGETALL HINCRBY HINCRBYFLOAT HKEYS HLEN HMGET HMSET HSET HSETNX HVALS HSCAN

上面 redis-benchmark 只是执行一些基本命令的性能测试,还可以自定义其他命令的性能测试,可使用 redis-benchmark --help 查看命令参数,自定义测试命令。

# 2. HyperLogLog 基数统计

这是一个很 NB 的算法,虽然我还没搞懂算法的每一个细节,但是单一个抛硬币隐身出来的数学算法,让人不得不叹服数学之伟大。

基数统计,它用于统计输入元素的数量,而不会存储元素本身。在 Redis 里面,每个 HyperLogLog 键只需要 12k 内存,就可以计算将近 2^64 个不同元素的基数。

基数统计只有 3 个命令,如下

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

# 3. 发布订阅(pub/sub)

发布订阅是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。 使用示例如下:

redis 127.0.0.1:6379> SUBSCRIBE redisChat  # 订阅redisChat频道

redis 127.0.0.1:6380> PUBLISH redisChat "hello"  # 发布消息,在订阅频道可以接收到消息
redis 127.0.0.1:6380> PUBLISH redisChat " world"   # 发布消息,在订阅频道可以接收到消息
1
2
3
4

发布和订阅的其他命令 PSUBSCRIBE PUBSUB PUBLISH SUBSCRIBE UNSUBSCRIBE

# 4. 事务

redis 的事务是一个让命令顺序执行的打包操作,它只保证命令执行中不会被插入其他命令执行,允许命令执行失败,在 EXEC 调用后才开始执行。Redis 的单个命令是原子的,但是 redis 的事务不是原子的,并且事务执行中发生错误,事务不会被回滚。

使用示例

127.0.0.1:6379[1]> set a aaa
QUEUED
127.0.0.1:6379[1]> set b bbb
QUEUED
127.0.0.1:6379[1]> set c ccc
QUEUED
127.0.0.1:6379[1]> exec
1) OK
2) OK
3) OK
1
2
3
4
5
6
7
8
9
10

相关命令 DISCARD EXEC MULTI UNWATCH WATCH

# 5. Redis 脚本

Redis 脚本使用 Lua 解释器,执行脚本命令为 EVAL,命令语法如下

127.0.0.1:6379> EVAL script numkey key [key ...] arg [arg ...]
1

实例

127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"
1
2
3
4
5
6

相关命令 EVAL EVALSHA SCRIPT "SCRIPT FLUSH" "SCRIPT KILL" "SCRIPT LOAD"

# 6. Redis 连接

命令比较简单,简单罗列一下 AUTH ECHO PING QUIT SELECT

Redis 启动后默认有 16 个数据库(0-15),使用 select 命令切换

> select 0 # 切换到0号库
> select 1 # 切换到1号库
1
2
# 查看密码
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
1
2
3
4
# 设置密码并授权登录
127.0.0.1:6379> CONFIG set requirepass "gao"
OK
127.0.0.1:6379> AUTH "gao"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "runoob"
1
2
3
4
5
6
7
8

# 7. Redis 服务器

服务器命令主要用于管理 redis 服务。命令比较多,罗列如下 BGREWRITEAOF BGSAVE "CLIENT KILL" "CLIENT LIST" "CLIENT GETNAME" "CLIENT PAUSE" "CLIENT SETNAME" "CLUSTER SLOTS" COMMAND "COMMAND COUNT" "COMMAND GETKEYS" "TIME" "COMMAND INFO" "CONFIG GET" "CONFIG REWRITE" "CONFIG SET" "CONFIG RESETSTAT" DBSIZE "DBUG OBJECT" "DEBUG SEGFAULT" FLUSHALL FLUSHDB INFO LASTSAVE MONITOR ROLE SAVE "SHUTDOWN [NOSAVE][save]" SLAVEOF SLOWLOG SYNC

# 8. Redis 数据备份和恢复

SAVE 命令用于创建当前数据库的备份,命令会创建 dump.rdb 并保存在 redis 的安装目录。查看安装目录可以使用命令CONFIG GET dir查看。redis 的数据库恢复,只要将备份文件拷贝到 redis 安装目录并启动服务即可。另外数据库的备份可使用 BGSAVE 在后台执行备份操作

# 9. 管道和分区技术

通过管道执行 redis 命令

$(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
redis
:1
:2
:3
1
2
3
4
5
6
7
8

python 中使用管道

import redis

r = redis.Redis(host="localhost", port=6379)
pipe = r.pipeline(transaction=True)

pipe.set('name','sad')
pipe.set('age',20)

pipe.execute()
1
2
3
4
5
6
7
8
9

管道的执行和事务很像,执行语句中有失败的查询,不会影响后面语句的执行。但是事务中如果有查询语法错误,会在事务执行之前报错,而管道不会。管道技术主要用于加速查询,事务技术用于确保查询的执行顺序和执行完整性(即都执行一遍,即使会出错)。

分区技术是减小单一数据连接线程负载的手段,通过对键值的唯一性哈希将特定的键存储到对应 redis 实例,一般是对哈希值进行取余运算来映射。

编辑 (opens new window)
上次更新: 2023/02/24, 10:34:03
mongodb restore
index

← mongodb restore index→

最近更新
01
mongodb restore
03-06
02
pytesseract
02-28
03
consul
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2025 子嘉 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式