redis详解

本文全面介绍了Redis的各种命令,包括数据结构操作、事务管理、持久化配置、集群搭建等内容,适合初学者快速入门及进阶学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flushdb 清除所有key

 

set无序集合 无序性、唯一性

 

Sadd key 添加元素 sadd key a b c  唯一性不能重复

Srem key a 删除元素

Smembers key 查看所有元素

Spop key 弹出一个随机元素  弹出的返回值就删除掉

Srandmember key 显示一个随机元素

Scard key 返回集合元素个数

Smove key 移动元素到另一个集合

例子:sadd key a b c  sadd key1 d e f   smove key key1 a 移动key里面a元素到key1里面

Sinter 取交集

例子:sadd lisi a b c   sadd wang a c d   sinter lisi wang  显示 a c

Sunion 并集 就是所有的元素

例子:asdd lisi a b c    sadd wang a c d   sunion lisi wang  显示 a b c d

Sdiff 差集

例子:sdiff lisi wang 显示b   sdiff wang lisi 显示 d

Sinterstore 交集存储起来

例子:sinterstore res lisi wang     srmembers res 显示 a c

 

 

Set 有序集合

Zadd 添加 zadd class 12 zhang 15 lisi 20 wang 4 xiao

Zrange key start end [whthscores]根据排名查看所有元素

zrange class 0 -1 withscores   0是开始  -1是结束

(whthscores显示分数值,可选)

zrange class 0 -1 结果 升序排列

  "xiao" "zhang" "lisi" "wang"

zrange class 0 -1 withscores 结果

"xiao"   "4"  "zhang"  "12"  "lisi"  "15"  "wang" "20"

Zrangebyscore key min max [whitscores][limit] 根据分值查看元素

zrangebyscore class 10 20  withscores limit 1 2

"lisi" "15" "wang" "20" (偏移一位 取2个)

Zrank key 正序排列返回排名 zrank class xiao 返回0

Zrevrank key 倒序返回排名 zrevrank class xiao 返回3

 

Zremrangebyscore 根据分数删除 zremrangebyscore class 15 20

Zremrangebyrank 根据排名删除 zremrangebyrank class 0 0

Zrem key member删除指定 zrem class zhang

 

 

 

Zcard key 查个数

Zcount key min max     zcount class 1 20  返回4

Zinterstore des numkeys key [weight 权重]aggergate [sum max min]

计算并集

例子: zadd lisi 3 cat 5 dog 6 horse    

zadd wang 2 cat 6 dog 8 horse

zinterstore res 2 lisi wang aggregate sum

zrange res 0 -1 withscores

 "cat" "5" "dog" "11" "horse" "14"

权重例子:zinterstore res 2 lisi wang weights 2 1  aggregate sum

"cat" "8" "dog" "16" "horse" "20"

 

 

Hash结构  类似关联数组

Hset key field value 设置单个键与健值 hset user1 age 12

Hmset key field value[...]设置多个

例子:hmset user2 name wang age 21 sex v

Hget key field 获取单个键值 hget user1 name

Hmget key field [...]获取多个键值 hget user1 name age

Hgetall key 获取全部健与键值

Hdel key field 删除键

Hlen key 长度

Hincrby key field num 整数自增num  hincrby user2 age 3

Hincrbyfloat key field num 浮点型自增  hincrbyfloat user1 age 0.5

Hkeys key 返回key所有键

Hvals key 返回key 所有键值

 

 

字符串操作

redis默认有16个数据库 可以select 数量 选择哪个数据库

redis默认无有效期,持久化缓存 磁盘上

Set   nx没有key时操作 xx有值时操作

Mset 设置多个key value

get

mget

Del

Move  移动数据库

Existe 是否存在

Ttl key 查询生命周期 不存在返回-2

Rename 修改名字 重名覆盖

Renamenx 不存在时修改

Expire 设置生命周期 秒

Pexprie 毫秒生命周期

 

Setrange 偏移字节 set gzh hello  setrange gzh 1 0   得到 "h0llo"

Append 追加value

Getrange 获取偏移量的值   getrange gzh 1 4  得到"0llo"

Getset get旧值set新值  先返回旧值再设置新值覆盖旧值

Incr 自增  秒杀时可以使用 可以先设置总数量,抢资格decr

Decr 自减

Incrby 自定义整型 incrby key number

Incebyfloat 浮点型 0.5 0.6

Decrby  减去指定减量值之后, key 的值  SET count 100 DECRBY count 20 返回值(integer) 80

Decrbyfloat

在位上操作

Setbit

例子:65 0100 0001   

97 0110 0001

set char A setbit char 2 1  get char 返回 “a”

offset 最大值为2的32次方减一

Gitbit key num 获取num位置的值 1或者0  getbit z2 7

Bitcount key [start][end] 汇总

Bitop 对两个key 做位上的 and or 操作

 

 

 

 

List  链表

Lpush 把一个元素推到最左边

例子:lpush gzh a b c d  输出为 d c b a

Rpush 最右边 例子:rpush gzh a b c d  输出为 a b c d

Lpop 在最左边弹出一个值

Rpop 最右边

Lrange key min max  查看范围值  lrange gzh 0 -1

Lrem key num value 删除指定数量的值 lrem gzh 1 b 第一个b删除

Ltrim key min max  剪切 取min到max的值 ltrim gzh 0 3

Lindex key num  返回链表的值 lindex gzh 1 返回1位置值

Llen key 长度

Linsert key after(后)|before(前) search value  插入

例子:linsert gzh after d e 在第一个d后面加个e

Rpoplpush key1 key2  key1右边值弹出到key2左边推入

例子:rpoplpush gzh gzh1 会把gzh最右边的e 给gzh1最左边

Brpop gzh time 等待弹出  适合在线聊天

Blpop

  brpop gzh 20 等待20秒 如果gzh有新数据 则弹出数据

 

 

redis事务

Multi 开启事务

Exec 执行事务

Discard 取消事务  

事务不支持回滚,执行语句放到队列中,语句没有报错就能执行,执行事务后,正确的语句会执行,错误的报错,但是操作不会回滚

 

例子 事务不支持回滚

Set zhang 300  set zhao 200

开启事务  

multi

decrby zhao 100  返回QUEUED在队列中,并没有执行

sadd zhang pig    QUEUED 语句没错,但是类型不对

如果取消需要在执行前执行

执行事务

Exec 

返回结果

1) (integer) 100

2) (error) WRONGTYPE Operation against a key holding the wrong kind of value

mget zhang zhao   返回 "300" "100" 没有原子性,语句对了就会执行

 

加锁

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,当其他线程想要访问数据时,都需要阻塞挂起。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁,读锁,写锁等,都是在操作之前先上锁。

 

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候回判断一下再次期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

 

Watch 观察监视 可以多个key ,但是有一个key变化,事务就会取消

Unwatch 取消监视

例子:set ticket 1  就1张票

Watch ticket 监视这张票

Mutlti  开始事务

decr ticket 减1张票  QUEUED

decrby zhang 100  扣钱QUEUED

在执行之前 这1张票 没有了

Exec  执行后为空 语句不执行

(nil)

mget ticket zhang 返回 "0" 没有票 钱不变"300"

 

 

频道发布与消息订阅

Publish 发布         publish news 'hello'

Psubscribe  订阅一个频道 psubscribe news

Subscribe     订阅多个频道subscribe news1 news

 

 

Redis rdb快照

Redis的持久化有2种方式   1快照  2是日志

Rdb快照的配置选项

save 900 1      // 900内,有1条写入,则产生快照

save 300 1000   // 如果300秒内有1000次写入,则产生快照

save 60 10000  // 如果60秒内有10000次写入,则产生快照

(这3个选项都屏蔽,则rdb禁用)

stop-writes-on-bgsave-error yes  // 后台备份进程出错时,主进程停止写入

rdbcompression yes    // 导出的rdb文件是否压缩

Rdbchecksum   yes //  导入rbd恢复时数据时,要不要检验rdb的完整性

dbfilename dump.rdb  //导出来的rdb文件名

dir /usr/local/var/db/redis/   //rdb的放置路径

 

Aof 的配置

appendonly no # 是否打开 aof日志功能

appendfsync always   # 每1个命令,都立即同步到aof. 安全,速度慢

appendfsync everysec # 折衷方案,每秒写1次

appendfsync no      # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快,

no-appendfsync-on-rewrite  yes: # 正在导出rdb快照的过程中,要不要停止同步aof

auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写

auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

 

 


注: 在dump rdb过程中,aof如果停止同步,会不会丢失?

答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.

 

注: aof重写是指什么?

答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.

以解决 aof日志过大的问题.

 

问: 如果rdb文件,和aof文件都存在,优先用谁来恢复数据?

答: aof

 

问: 2种是否可以同时用?

答: 可以,而且推荐这么做

 

问: 恢复时rdb和aof哪个恢复的快

答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

 

redis集群

Redis 集群 主从分离

复制redis.conf

Redis6380.conf redis6381.conf

修改主库 关闭rdb只打开aof日志 修改 bind 127.0.0.1为0.0.0.0

80从库 开启rdb 关闭aof

81从库 都关闭

修改

port 6380(从库端口)

pidfile /var/run/redis_6380.pid

dbfilename dump6380.rdb

Redis5.4以后

replicaof localhost 6379(主库端口)

以前为

Slaveof localhost 6379

 

开启从库 redis-server /usr/local/etc/redis6380.conf 

连接从库 redis-cli -p6380

 

redis 服务器端命令

redis 127.0.0.1:6380> time  ,显示服务器时间 , 时间戳(秒), 微秒数

1) "1375270361"

2) "504511"

 

redis 127.0.0.1:6380> dbsize  // 当前数据库的key的数量

(integer) 2

redis 127.0.0.1:6380> select 2

OK

redis 127.0.0.1:6380[2]> dbsize

(integer) 0

redis 127.0.0.1:6380[2]>

 

 

BGREWRITEAOF 后台进程重写AOF

BGSAVE       后台保存rdb快照

SAVE         保存rdb快照

LASTSAVE     上次保存时间

 

Slaveof master-Host port  , 把当前实例设为master的slave

 

Flushall  清空所有库所有键

Flushdb  清空当前库所有键

Showdown [save/nosave]

 

注: 如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器

然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据.

 

如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.

 

Slowlog 显示慢查询

注:多慢才叫慢?

答: 由slowlog-log-slower-than 10000 ,来指定,(单位是微秒)

 

服务器储存多少条慢查询的记录?

答: 由 slowlog-max-len 128 ,来做限制

 

Info [Replication/CPU/Memory..]

查看redis服务器的信息

 

Config get 配置项  

Config set 配置项 值 (特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)


Redis运维时需要注意的参数

1: 内存

# Memory

used_memory:859192 数据结构的空间

used_memory_rss:7634944 实占空间

mem_fragmentation_ratio:8.89 前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.

2: 主从复制

# Replication

role:slave

master_host:192.168.1.128

master_port:6379

master_link_status:up

 

3:持久化

# Persistence

rdb_changes_since_last_save:0

rdb_last_save_time:1375224063

 

4: fork耗时

#Status

latest_fork_usec:936  上次导出rdb快照,持久化花费微秒

注意: 如果某实例有10G内容,导出需要2分钟,

每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.

 

 

5: 慢日志

config get/set slowlog-log-slower-than

CONFIG get/SET slowlog-max-len

slowlog get N 获取慢日志

 

 

 

复制rdb(6379)到其他库(6382)

先save保存

Shutdown nosave 停止但不把命令写入rdb

Pkill -9 redis 杀掉进程

cp dump.rdb dump6382.rdb  复制rdb

redis-server /usr/local/etc/redis6382.conf 开启

redis-cli -p 6382 进入

Keys *  查看所有key  

 

 

 

Sentinel哨兵 选项配置

port 26379 # 端口

sentinel monitor mymaster 127.0.0.1 6379 2 ,

给主机起的名字(不重即可),

当2个sentinel实例都认为master失效时,正式失效

 

sentinel down-after-milliseconds mymaster 30000  多少毫秒后连接不到master认为断开

sentinel can-failover mymaster yes #是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./

sentinel parallel-syncs mymaster 1 , 一次性修改几个slave指向新的new master. 默认一个不可多台同时指向防止高并发

sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在重新配置new master,new slave过程,可以触发的脚本

 

#redis-sentinel-26379.conf  配置文件

port 26379

daemonize yes

pidfile "/var/run/redis-sentinel.pid"

logfile "26379.log"

dir "/opt/soft/redis/redis/data"

sentinel myid 79f32bcda5f25af012013038a790512947610699

sentinel deny-scripts-reconfig yes

sentinel monitor mymaster 127.0.0.1 7000 2

sentinel config-epoch mymaster 0

# Generated by CONFIG REWRITE

protected-mode no

user default on nopass ~* +@all

sentinel leader-epoch mymaster 0

sentinel known-replica mymaster 127.0.0.1 7001

sentinel known-replica mymaster 127.0.0.1 7002

sentinel current-epoch 0

redis   cluster集群

生成6个redis.conf  port是7000 到7005

#redis.conf配置文件

bind 127.0.0.1

pidfile "7000.pid"

port 7000

daemonize yes  #守护进程模式

dir "/opt/soft/redis/redis/data" 生成文件存放路径

logfile "7000.log"

#dbfilename "dump-7000.rdb"

cluster-enabled yes  #开启集群

cluster-config-file nodes-7000.conf  #会自动生成的集群文件

cluster-require-full-coverage no  #出错时是否全部受影响

#开启redis 7000到7005

sudo redis-server redis-7000.conf  

#生成集群 redis5以后版本使用redis-cli  之前版本用redis-trib.rb工具

#用以下命令创建集群,--cluster-replicas 1 参数表示希望每个主服务器都有一个从服务器,这里则代表3主3从,前3个代表3个master,后3个代表3个slave。

#通过该方式创建的带有从节点的机器不能够自己手动指定主节点,redis集群会尽量把主从服务器分配在不同机器上。

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

#查看集群状态

redis-cli -c -p 7000 cluster info

#查看集群节点

redis-cli -c -p 7000 cluster nodes

#集群扩容增加节点

#增加7006  7007两个节点  7007为7006从节点

#生成配置文件 redis-7006.conf  redis-7007.conf  

sed "s/7000/7007/g" redis-7000.conf > redis-7007.conf

#启动配置文件

redis-server redis-7006.conf 

#增加新节点

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

#查看一下集群节点

redis-cli -c -p 7000 cluster nodes

#为新增主节点分配槽位

redis-cli --cluster reshard 127.0.0.1:7000

#分配过程中,会出现如下几个提示:第一个是要分配多少槽位?4096  第二个是新增节点的ID ?查看节点里面有 第三个是 是否全部分配  ?all

#将新增的从节点7007添加到集群中

redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000

#建立新增节点的主从关系    (一长串是7006的ID)

redis-cli -p 7007 cluster replicate 1d471bdad4ca6a4805abff7479097eb027b5d5f9 

#集群收缩  移除节点

#先移除槽位 --cluster-from {待移除的NodeId} --cluster-to {接受移除槽位的NodeId} --cluster-slots {移除的槽位个数}

redis-cli --cluster reshard --cluster-from 1d471bdad4ca6a4805abff7479097eb027b5d5f9 --cluster-to f0f40b04a9941dbd04df9de685feeb176e9ce611 --cluster-slots 1366 127.0.0.1:7006

#删除节点 {待删除的NodeId}  先删从节点7007  再删主节点 7006

redis-cli -p 7000 --cluster del-node 127.0.0.1:7000 dd147992b328c80ab8033c6044314959094507fc

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值