zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

redis学习

2023-09-14 09:16:28 时间

参考

redis

key-value数据库
特点:
1 支持数据的持久化
2 支持简单的key-value类型的数据,同时提供string list set zset hash等结构的存储
3 支持数据备份 master-slave模式,有rdb&aof
下载 http://www.redis.cn/download.html

配置文件 位于安装目录下

redis.conf
格式
CONFIG GET CONFIG_SETTING_NAME
CONFIG GET loglevel
CONFIG GET *
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
CONFIG SET loglevel “notice”
port 6379
bind 127.0.0.1
loglevel verbose (degug verbose notice warning)
设置数据库数量
databse 16
指定多长时间 有多少次更新 就将数据同步到db
save
save 900 2
表示900秒内有2次更改
maxclients 128 (0)不限制 同时时间最大客户端的连接数
maxmemory
string 类型是二进制安全的 可以包含任何数据 如jpg图片或序列化的对象 最大512MB
set name “zhaox”
get name “zhaox”
hash 是一个键值key=>value对集合 适合存储对象
HMSET user:1 name zhaox pwd 123
HGETALL user:1

name
zhaox
pwd
123
list 字符串列表 最多存储 2^32-1个元素
lpush zhaox redis
lpush zhaox memcache
lpush zhaox rabbitmq
lrange zhaox 0 10
lrange 获取的结果与添加的顺序相反
rabbitmq
memcache
redis
set 是string类型的无序集合 添加删除查找复杂度0(1)
sadd key member
sadd zhaox redis
sadd zhaox memcache
sadd zhaox mong
sadd zhaox mong

smembers zhaox

mong
memcache
redis

zset 有序集合并且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis通过分数来为集合
中的成员进行从小到大的排序 ,zset成员唯一,但score分数可以重复
zadd key score member
zadd zhaox 0 redis
zadd zhaox 0 mong
zadd zhaox 0 rabbitmq
zadd zhaox 0 rabbitmq
ZRANGEBYSCORE zhaox 0 1000

redis
mong
rabbitmq

数据备份与恢复

SAVE 创建当前数据库的备份
将在redis安装目录中创建dump.rdb文件
恢复
将备份文件dump.rdb移动到redis安装目录并重启服务即可
获取目录 CONFIG GET dir
BGSAVE 后台执行备份
安全
CONFIG GET requirepass
如果获取结果为空则无需密码 客户端即可连接到redis服务
设置密码为zhaox
CONFIG SET requirepass “zhaox”
CONFIG GET requirepass
连接时密码验证
AUTH password
AUTH “zhaox”
set mykey “zhaoxtest”
get mykey

性能测试

-h 指定主机名 127.0.0.1
-p 端口9379
-s 服务器socket
-c并发连接数 50
-n 请求数 10000
-d 以字节的形式指定set/get值的数据大小
-k 1=keep alive 0 reconnect 1
-r get/set/incr使用随机key,sadd使用随机值
-p 通过管道传输 请求 1
-q 强制退出redis 仅显示 query/sec值
–csv 以csv格式输出
-l 生成循环 永久执行测试
-t 仅运行以逗号分隔的测试命令列表
-l idle模式,共打开n个idle连接并等待

redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
测试命令set lpush请求数为10000,通过-q让结果只显示 每秒执行的请求数。

客户端连接

连接后,客户端 socket会被 设置为非阻塞模式,redis采用非阻塞多路利用模型,然后设置tcp_nodelay属性,禁用nagle算法,然后创建一个可读的文件事件用于监听这个客户端的socket的数据发送。
config get maxclients
默认10000
client list 返回连接到redis服务的客户端列表
client setname 设置当前连接的名称
client getname获取通过client setname 命令设置的服务名称
client pause 挂起客户端连接
client kill关闭客户端连接

管道技术

为了提升性能
通常的tcp连接,客户端发送请求,监听socket返回,阻塞并等待服务端响应。
redis管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次读取所有服务端的响应。

分区

分区是分割数据到多个redis实例的处理过程,因此每个实例只保存key的一个子集。

优势

利用多台计算机的内存和值 ,构造更大的数据库
通过多核和多台计算机,允许扩展计算能力。通过多台计算机和网络适配器,允许我们扩展带宽

不足

涉及多个key的操作通常不支持。如当两个set映射到不同的redis实例上时,你不能对两个set执行次操作
涉及多个key的redis事务不能使用
当使用分区时,数据处理复杂,如你处理多个rdb/aof文件,并从多个实例和主机备份持久化文件
增加或删除容量也比较复杂。redis集群大多数支持在运行时增加 删除节点的透明数据平衡的能力。但是类似于客户端分区,代理等其他系统不支持这项特性。

分区类型

范围分区:
映射一定范围的对象到特定的redis实例
如id 从0到10000保存到r0实例,id从10001-20000的用户会保存到实例r1,以此类推
哈希分区:
对任何key都适用

  • 用一个hash函数将key转换为一个数字,如用crc32hash函数
  • 对spckey执行crc32hash(spckey)输出类型99999922的数字
  • 对这个整数取模,将其转化为0-3的数字,就可将这个整数映射到4个redis实例中的一个了。
  • 99999922%4=2 ,就是说spckey应该被存在r2实例中。

命令

redis-cli会尝试连接本机redis服务

redis-cli

ping

远程
redis-cli -h host -p port -a password
ex:reds-cli -h 127.0.0.1 -p 6379 -a “zhaox”

键 命令

用于管理redis
语法:command key_name
set zhaoxname zhaox
get zhaoxname
del zhaoxname
成功:1 失败:0
del key
dump key 序列化key并返回被序列化的值
exists key
expire key seconds 为key设过期时间
expire key timestamp 类似expire,不同的是接受的时间是unix时间戳(unix timestamp)
pexpire key milliseconds 设置过期时间以毫秒计
pexpireat key milliseconds-timestamp
keys pattern
move key db
persist key 移除key的过期时间
pttl key 以毫秒为单位返回key的剩余过期时间
ttl key 以秒为单位 返回key的剩余时间 time to live
randomkey 随机返回一个key
rename oldkeyname newkeyname
renamenx key newkey 仅当newkey不存在时,将key改名为newkey
type key

1 字符串string

COMMAND keyname
set key value
get key
getrange key start end
zhaox range 0 1 zh
zhaox range 0 2 zha
zhaox range 2 4 aox
getset key newvalue 设置新值 并返回旧值
getbit key offset 对key所存储的字符串值,获取指定偏移量上的位(bit) 返回结果1或0
mget key1 key2 key3 获取一个或多个key的值,中间用空隔隔开
mset key1 key1value key2 key2value key3 key3value
msetnx key1 value key2 value key2 value
同时设置多个key值 ,当且仅当所有给定key都不存在
setbit key offset value 对key所存储的字符 串值,设置或清除指定偏移量上的位
set zhaox zhaox
setbit zhaox 1 0 //:haox
setbit zhaox 1 1 //zhaox
setbit zhaox 4 0 //Rhaox
setex key seconds value 将值value关联到key,并设置过期时间(秒)
psetex key milliseconds value 和上sexex相同,只是时间不同
setnx key value 当key不存在时设置key的值
setrange key offset value
//set zhaox zhaox_abcdefg
setragne zhaox 2 jk
get zhaox //zhjkx_abcdefg
strlen key
incr key 一次加一 key必为可增加的数字类型
incrby key increment 将key中存储的值加上给定的增量值increment
incrbyfloat key increment
decr key
decrby key (这里不可用float类型)
append key value 追加 (key存在且为字符串)

2 哈希hash

是一个string类型的field和value的映射表,很适合存对象
每个hash可存2^32-1 键值对 40多亿
在这里插入图片描述在这里插入图片描述

hdel key field1 field 2 fieldx
hmset key:index field1 value1 field2 value2 fieldx valuex
hmset user:1 firstname zhaox lastname xx age 30 sex male
hgetall user:1
//下面的这两个field只可输入一个 不可多个
hexists key field
hget key field
多个用
hmget key field1 field2 fieldx
hincrby key field increment
hincrbyfloat key field increment
在这里插入图片描述
在这里插入图片描述
hkeys key
hlen key
hmget key field
hset key field value
hmset key fieldx valuex fieldy valuey
在这里插入图片描述
hgetall key 获取键和值
hvals key 获取值
hsetnx key field value只有在field不存在时,才设置字段的值
//这个没试出来 迭代哈希表中的键值对
hscan key cursor[match pattern] [count count]

3 列表list

最多2^32 -1 (4294967295)个元素 40亿2.9kw
可以在左侧(头)或右侧(尾)插入
lpush key value 如果 key已经存在,而不是List类型会报错
lrange key 0 100
lpush list 1
lpush list abc
lrnage list 0 100
blpop listkeyname timeout 从头出指定超时时间
brpop listkeyname timeout 从尾出指定超时时间
如果没有元素会阻塞列表直到等待超时或发现可弹出元素为止
brpoplpush source destination timeout
从列表中弹出一个元素x,并将x插入到目标列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
rpoplpush source destination
lindex key index 通过索引获取元素 从头开始下标为0
linsert key before|after pivot value
llen key
lpop key 从头移出并返回第一个元素
在这里插入图片描述linsert keyname before|after pivot value
在key中pivot节点的前面或后面插入value pivot为list中元素的值 并非索引
在这里插入图片描述lpush listkeyname value1 value2 valuex
lrange listkeyname startindex endindex
lrem listkeyname count value
从listkeyname中移除count个值为value的元素
lset listkeyname index value
ltrim listkey start stop 保留区间start stop中的元素,不在此区间全删除

在这里插入图片描述rpop listkeyname
在这里插入图片描述rpush key value1 value2 valuex
rpushx key value 为已存在的列表添加值

4 集合set

set是string类型的无序集合,集合成员是唯一的,复杂度o(1),是通过哈希表实的 最大成员数2^32-1
在这里插入图片描述sadd key member1 member2 memeberx
scard key 返回key中成员数
sdiff key1 key2 返回key1 key2差集
sfiffstore destination key1 key2
返回给定集合的差集并存在destination中
sinter key1 key2 交集
sinterstore destination key1 key2
sismember key member 判断member是否是key的成员
smembers key
smove source destination member
spop key
spop 移除并返回set中的一个随机元素
srandmember key cout返回集合中的一个或多个随机数
这个只是返回并没有移除
srem key member1 member2移除元素
sunion key1 key2 返回并集
sunionstore destination key1 key2 返回并集并存至destination
sscan key cursor [match pattern] [count count]
迭代集合中的元素

5 有序集合 sorted set

与set基本特征相同,不同的是每个元素都会关联一个double 类型的分数。redis通过分数来为集合中的成员进行从小到大的排序。
有序集合中的成员是唯一的,但是分数(score)可以重复。
通过哈希表实现 复杂度o(1) 2^32-1
在这里插入图片描述zadd key score1 member1 score2 member2 scorex memberx
zcard key
zcount key min max 计算在有序集合中指定区间分数的成员数
min max 代表的是分数 ,不是索引
zincrby key increment member
//zincrby zhaox 30 redis22 给成员redis22的分数增加30,如果它不存在则创建一个新的成员分数为30
对有序集合中的指定成员的分数上增加增量increment

计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
zinterstore destination numberkeys key key
zinterstore dest 2 key1name key2name
numberkeys的数量要和它后面key1name key2name keyxname的数量相同 否则报语法错误
//zinterstore dest_newkey 2 key1 key2
zrange key start stop [withscores] 通过索引区间返回有序集合成员指定区间内的成员
zrnage key start stop
zrank key memeber 返回有序集合中指定成员的索引
zrem key member1 member2 memberx
zrevrank key member 返回有序集合中指定成员的排名,有序集成员按分数值递减 从大到小排序
zscore key member 返回有序集合中成员的分数值
zunionstore destination numberkeys key1 key2 …

zlexcount key min max (在有序集合中计算指定字典区间内成员数量)
zrangebylex key min max [limit offset count] 通过字典区间返回有序集合的成员
zrangebyscore key min max withscores
zremrangebylex key min max 移除有序集合中给定的字典区间的所有成员
zremrangebyrank key start stop 移除有序集合中给定的排名区间的所有成员
zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员
zrevrange key start stop withscores 返回有序集合中指定区间内的成员,通过索引,分数从高到低
zrevrangebyscore key max min withscores 返回有序集合中指定分数区间内的成员,分数从高到低
zscan key cursor [match pattern] [count count]迭代有序集合中的成员,包括元素成员和元素分值