Redis中文网站1(不可用了)

Redis中文网站2(有广告)

Redis中文网站3(简洁版)

查看Redis进程

ps -ef | grep redis

alt

Linux进入Redis客户端

  • 链接
redis-cli 
常用参数(选项) 解释
-h 连那一台主机,默认127.0.0.1
-p 哪一个端口,默认6379
-n 哪一个数据库(redis有0~15 十六个数据库),默认0号库

redis-cli -p 6380 链接本机6380端口的redis的默认数据库

alt

redis-cli -p 6380 --raw 链接本机6380端口的redis的默认数据库,按utf-8格式化汉字

alt

注:redis是二进制安全的,数据库里存的只是字节流,字符流在不同编码下可能会出现乱码现象

redis存储的是客户端编译好的字节数组,不同的客户端可以在同一个redis上用不同的编码存储,redis不会重新编译客户端的数组

  • 退出
exit

redis命令

  • help命令
help

alt

help set 查看set命令帮助文档

EX : 过期时间,单位秒

PX : 过期时间,单位毫秒

NX : k1不存在时才会给k1操作,只能新建,若k1存在,不会改变k1的值,用于分布式锁

XX : 只有k1存在时才会操作,只能更新

alt

  • clear命令

将屏幕清空

  • type命令

查看key值的数据类型,redis一共有5中数据类型:

  1. String Byte:字符串、数值、bitmap
  2. List:
  3. Hash map(k-v):
  4. Set:
  5. sorted_set:
type k1

查看k1值的数据类型

alt

  • object命令

object help 查看object命令帮助文档

alt

OBJECT encoding key

返回用于存储与键关联的值的内部表示形式的类型

alt

注:set k1 99 因为set是string组的,所以type k1 是string类型,set k2 hello type k2 是string类型; object encoding k2 是meb编码的string,object encoding k1 是int类型,说明k1使用的是int编码,可以进行string类型的数值操作。

部分string操作命令会改变key的编码类型。

设置key的超时时间

1.设置key时就设置超时时间
设置k1 20秒后超时,值为aaa
set k1 aaaa ex 20

查看key的超时时间
ttl k1

2.单独给key添加超时时间
set k2 aaa

ttl k2

expire k2 50

3.倒计时设置key的超时时间

expireat key timestamp(时间戳)

alt

alt

alt

注:1.有超时时间的key中途访问不会刷新key的超时时间

2.有超时时间的key超时标志是-2,没有超时时间的key是-1

3.key在没有超时的时候重新赋值,会根据赋值命令重新计算时间,如命令为set k1 aaa 超时时间变为-1, set k1 ddd ex 200超时时间会变为200秒

String类型的面向字符串操作的常用命令

  • 查看有字符串造作命令
help @string

alt

  • set命令

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
SET key value [过期 EX 秒 | PX 毫秒] [NX key不存在时设置key的值|XX key存在时设置key的值]

set k1 hello

在默认的数据库设置k1和k1的值

alt

  • get命令
get k1

在默认的数据库获取k1的值

alt

  • mset命令
mset k3 a k4 b

设置多个key-value的值

alt

  • mget命令
mget k3 k4

获取多个key的值

alt

  • MSETNX命令
MSETNX k1 a k2 b

当k1、k2不存在时,设置他们的值

alt

MSETNX k2 c k3 d

msetnx命令的原子性操作,当一个key设置失败,其他key也不会成功

alt

  • getset命令
getset k1 rongyan

给key设置新值,并把老值返回回来

alt

  • keys命令
keys *

查看当前库所有key

alt

  • FLUSHDB命令

清空当前数据库

  • FLUSHALL命令

清空所有数据库

  • select命令
select 8

切换到8号数据库

alt

在8号数据库无法获取默认数据库k1的值

alt

  • append命令
append k1 " world"

在k1后面追加字符串

alt

  • GETRANGE命令

正反向索引

GETRANGE k1 6 10

GETRANGE k1 6 -1   

截取k1中的world

alt

  • SETRANGE命令
SETRANGE k1 6 rongyan

从指定位置修改k1的值

alt

  • strlen命令
strlen k1

获取k1 字符串的长度

alt

String类型的面向数值操作的常用命令

  • incr命令
incr k1

k1的值+1,incr固定+1

alt

  • incrby命令
incrby k1 22

k1的值+22

alt

  • decr命令
decr k1

k1的值-1,decr固定-1

alt

  • decrby命令
decrby k1 21

k1的值-21

alt

  • INCRBYFLOAT命令
INCRBYFLOAT k1 1.5

k1的值+1.5,可以加小数

alt

String类型的面向bitmap(位图)操作的常用命令

对二进制位操作的命令

  • setbit命令
setbit k1 1 1

设置k1的二进制码为01000000,8位二进制码为一个字节,所以k1值得长度为1,"@"符号的ASCII码是64(十六进制是40),二进制是01000000

alt

setbit k1 7 1

将k1值的二进制第8位设置为1,"A"的ASCII码是65(十六进制是41),二进制是01000001

alt

setbit k1 9 1

此时k1的长度为2,二进制码为0100 0001 0100 0000,k1的值为A@

alt

注:可以使用man ascii命令查看ASCII码

alt

alt

hex:十六进制 oct:八进制 dec:十进制 bin:二进制

  • bitpos命令

Find first bit set or clear in a string

找到第一个二进制位,在字符串中设置或清除它

BITPOS key bit [start] [end]

命令 key 二进制位(0或1) 字节的起始 结束位置(是字节的位置,不是字符的位置)
BITPOS k1 1 0 0

k1的值为A@,二进制码为0100 0001 0100 0000,第一个字节是"A",第一个字节的二进制1所在位置是1;第二个字节是"@",第二个字节的二进制1所在在位置是9

alt

  • bitcount命令
bitcount k1 0 1

统计k1指定字节位置的值的二进制1出现的次数

alt

  • bitop命令

k1的值"A",二进制码0100 0001

k2的值"B",二进制码0100 0010

bitop and andkey k1 k2

将k1和k2的二进制码进行按位与操作,得到0100 0000 -> "@",将值存到andkey

alt

bitop or andkey k1 k2

将k1和k2的二进制码进行按位或操作,得到0100 0011 -> "C",将值存到andkey

alt

应用场景举例

alt

list类型操作命令

  • 相关命令

alt

  • lpush 从左侧将元素放入集合
lpush k1 a b c d e f
  • rpush 从右侧将元素放入集合

注:同向命令可以描述栈,反向命令可以描述队列

  • lrange 查看集合指定位置的元素
lrange k1 0 -1

查看k1集合所有元素

alt

  • lindex 获取集合指定位置的元素
lindex k1 2

取出从左侧数第3个元素,不会删除集合数据

alt

  • lpop 从左侧将元素弹出集合

alt

弹出元素的同时会删除集合中的元素

  • rpop 从右侧将元素弹出集合

  • lset 修改从左侧数的指定元素

lset k1 3 xxxxx

将c修改为xxxxx

alt

注:对索引操作可以描述数组

  • lrem 移除集合中的一些元素
lpush k3 1 a 2 b 3 a 4 c 5 a 6 d

lrem k3 2 a

移除k3从左侧数两个'a',-2则是从右侧数两个'a'

alt

  • linsert 在指定元素前后插入元素
linsert key after|before 指定元素 插入元素

linsert k3 after 6 a

在元素6后面插入a

alt

注:如果有两个6,只会在在一个后面插入a。

  • blpop

删除并获取列表中的第一个元素,或者阻止,直到有一个可用为止

alt

阻塞,单波队列 FIFO(先到先服务)

  • ltrim 删除两端指定位置的元素
ltrim key 0 -1

ltrim key 2 -3

alt

Hash类型操作

  • 相关命令

alt

和String类型命令类似,只是以H开头

  • hset
hset sean name dzf
  • hmset
hmset sean age 18 address bj

注:插入时key和value是成对的

  • hget
hget sean name
  • hmget
hmget sean name age
  • hkeys
hkeys sean
  • hvals
hvals sean
  • hgetall
hgetall sean

alt

  • hincrby
hincrby sean age -1

年龄加-1岁

  • hincrbyfloat
hincrbyfloat sean age 0.5

年龄加0.5岁

alt

Set类型操作

  • 相关命令

alt

set类型特点:无序、去重

  • sadd 向key中添加多个值
sadd k1 tom seam peter ooxx tom xxoo

向k1插入值,会自动去重

  • smembers 查看key的值
smembers k1

查看k1的值

alt

  • srem 移除set中的元素
srem k1 ooxx xxoo

alt

  • sinter 计算指定key的交集
sadd k2 1 2 3 4 5

sadd k3 4 5 6 7 8

sinter k2 k3

直接打印k2、k3的交集

alt

  • sinterstore 计算指定key的交集存放到新的key中
sinterstore dest k2 k3

将k2、k3的交集结果放到dest中

alt

  • sunion 计算指定key的并集,自动去重
sunion k2 k3

alt

  • sdiff 计算指定key的差集
sdiff k2 k3

sdiff k3 k2

alt

  • srandmember 随机取数
sadd k1 tom ooxx xxoo xoxo oxox xoox oxxo

srandmember key count

srandmember k1 5

正数:取出一个去重的结果集(不能超过已有集)

负数:取出一个带重复的结果集,一定满足你要的数量

如果0,不返回

alt

  • spop 随机取数并删除集合中该数值

适用于抽奖每次抽单人且不重复

spop k1

alt

有序集操作(Sorted_Set)

特点:会对数据排序且去重,物理排序左小右大

  • 相关命令

alt

  • zadd 添加数据

添加数据的时候需要给数据添加一个可以用以排序的数值(维度),如果维度相同则安字典排序

zadd k1 8 apple 2 banana 3 orange
  • zrange 按索引查看数据
zrange k1 0 -1

zrange k1 0 -1 withscores

alt

  • zrevrange 反向按索引查看数据

反向命令查询出来的数据会按从大到小排序

zrevrange k1 0 -1

alt

  • zrangebyscore 按分值查看数据
zrangebysocre k1 3 8

取分值在3到8的数据

alt

  • zscore 通过元素查看元素的分值
zsocre k1 apple
  • zrank 通过元素取出元素的排名
zrank k1 apple

alt

  • zincrby 增加元素的分值
zincrby k1 2.5 banana

alt

  • zunionstore 集合操作并集

zadd k1 80 tom 60 sean 70 baby

zadd k2 60 tom 100 sean 40 yiming

ZUNIONSTORE 目标key key的数量 key... [权重...(默认1,与key一一对应)] [聚合参数 SUM|MIN|MAX (默认SUM)]

zunionstore unkey 2 k1 k2

zrange unkey 0 -1 withscores

alt

带权重

zunionstore unkey1 2 k1 k2 weights 1 0.5

zrange unkey1 0 -1 withscores


求和时key1的值乘以1、key2的值乘以0.5,再相加

alt

带聚合参数

zunionstore unkey1 2 k1 k2 aggregate max

zrange unkey1 0 -1 withscores


alt

管道符

一次发送多个命令,减少往返时间

  • Socket链接每次发送命令都要往返通讯一次
nc localhost 6379

alt

  • 利用管道符一次发送多个命令

注:linux要用"\n"换行,Windows要用"\r\n"换行

echo -e "sdfsdf\nsdfsdf"

echo -e "set k2 99\nincr k2\n get k2" | nc localhost 6379

alt

'-e'识别换行符

  • 验证

alt

发布订阅

  • 相关命令

alt

  1. 无人监听下向通道推送数据
publish ooxx hello

alt

直播间内有人发送了一条弹幕

  1. 监听ooxx通道
subscribe ooxx

alt

新人进入直播间,无法查看之前的消息

  1. 再次推送数据
publish ooxx helloxiaotuantuan

alt

又有人发送了弹幕

  1. 监听端实时收到消息

alt

进入直播间后就可以实时看到其他人发送的消息了

redis事务

  • 相关命令

alt

  • multi 开启事务
multi

set k1 aaa

set k2 bbb

exec
  • exec 执行事务

alt

两个客户端同时在一个redis服务上执行事务

  1. 客户端1先开启事务

alt

  1. 客户端2后开启事务

alt

  1. 客户端1取'k1'的值

alt

  1. 客户端2删除'k1'的值

alt

  1. 客户端2先执行

alt

  1. 客户端1后执行

alt

客户端1先开启事务,后执行事务,k1值被客户端2删掉了,客户端1则取不到

  • watch 监控key

先监控key,再开启事务,如果事务执行前被监控的key被修改了,则不执行此次事务

watch k1

两个客户端同时在一个redis服务上执行事务

  1. 客户端1,先监控k1,开启事务,输入命令

alt

  1. 客户端2,后开启事务,输入命令,先执行事务

alt

  1. 客户端1执行事务

alt

因为k1的值被更改了,所以当前事务没执行

学习总结

1. redis 介绍及NIO原理介绍

alt

alt

2. redis安装、string类型、bitmap、list、set、hash、sorted_set、skiplist

alt

3. 使用

alt

4. redis集群

alt

alt

alt

alt

5. 常见问题

alt

alt