levels of contents

redis-1,基础和十大数据类型

redis

十大数据类型

  • string
    二进制安全

  • set
    无序不重复数据

  • zset
    有序不重复数据

  • list
    双向链表

  • redis GEO
    地理数据

  • HyperLogLog
    基数统计
    比如统计某网站访问量
    不重复的数据就叫基数

  • bitmap
    二维数组

  • bitfield
    位域

  • stream

  • redis的key

数据库常用命令

默认是16个数据库,一般默认使用0号库
命令是不区分大小写的,key区分大小写
keys * 查看当前库所有key
exist key 查看这个key是否存在
EXIST key
type key 查看这个key是什么类型
del key 删掉这个key数据
unlink key 非阻塞删除,相当于del,仅仅是将keys从keyspace中删除,真正的删除在后面的异步中操作
ttl key time to leave 查看还有多少秒过期,-1代表永不过期,-2代表已经过期,没有指定一般默认永不过期
EXPIRE key 5 设置5秒过期
move key dbindex[0-15] 将当前数据库的key移动到给定的数据库db中
select dbindex 切换数据库,默认为0
dbsize 查看当前数据库key的数量
flushdb 清空当前库
flushall 清除所有库
中文乱码问题: redis-cli -a 111111 --raw

reids各类型常用指令

1.string类型

字符串 单值单value

set key value

set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unlx-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
set k1 v1

set 命令有expxnxxxkeepttl五个可选参数,

  • ex seconds 以秒为单位设置过期时间
  • px milliseconds 以毫秒为单位设置过期时间
  • exat timestamp 设置以秒为单位所对应的unix时间戳所对应的过期时间
  • pxat milliseconds-timestamp 设置以毫秒为单位所对应的unix时间戳所对应的过期时间
  • nx 键不存在的时候设置键值
  • xx 键存在的时候设置键值
  • keepttl 保留设置前指定键的生存时间,再次设置的话不会更改生存时间,第一次设置了之后会有个生存时间,如果再次设置的时候不加这个参数,会重置第一次的生存时间,第二次设置的时候加上这个参数就不会重置生存时间了

get key

get 返回键原本的值,键不存在时返回nil

案例

同时设置/获取多个键值 mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
msetnx k1 v1 k4 v4 要么一起成功,要么一起失败
获取指定区间内的值 getrange/setrange
setrange 可以设置已经存在的值,offset是设置的起始位置
数值增减 递增数字 incr key
增加指定的数 incrby key increment
递减数值 decr key
减少指定的整数 decrby key decrement
获取字符串长度和内容追加 strlen key
append key value
分布式锁 setnx key value
setex(set with expire)键秒值/setnx(set if not exist)
先get再set getset

2.list列表数据结构

常用命令 单key多value
简单说明 底层是个双端列表,只要功能push/pop,一般用在栈,队列,消息队列等场景
案例 lpush/rpush/lrange 没有rrange,lpush和rpush用来设置链表,lrange用来遍历输出列表
lpush list1 1 2 3 4 5
lrange list 1 0 -1 0,-1指定输出范围
lpop/rpop
lindex 按照索引下标获得元素,从上到下,从0开始
llen 获取元素的个数
lrem key 数字n给定值v1,解释(删除n个值等于v1的元素)
lrem list1 2 v1 删除两个值为v1的值
itrim key 开始index 结束index 截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表 源列表弹出,目的列表接收
lset key index value 设置为某个新值
linsert key before/after

3.redis哈希

kv模式不变,但是v是一个键值对
hset,hget,hmset,hmget,hgetall,hdel
hset user:001 id 01 name zs age 11
hget user:001 id
hgetall user:001
hdel user:001
hlen
hexists keykey里面某个值的key

hexist user:001 name
hkeys,hvals
hkeys user:001
hvals user:001
hincrby,hincrbyfloat
hincrby user:001 age 1
hsetnx 不存在就赋值,存在了就无效
使用场景:购物车

4.redis集合(Set)

单值,多value,但是没有重复值
sadd key member 添加元素

sadd set1 1 1 2 3 4 5 5只会添加五个元素,重复的添加不上
smembers key 遍历集合中的所有元素
sismember set1
sismember key member 判断元素是否在集合中
sismember set1 x返回0,sismember set1 1返回1
srem key member [member...] 删除元素
srem set1 1删除不存在的元素返回0,删除存在的元素返回1
scard 获取集合里面的元素的个数
scard set1
srandmember key [数字] 从集合中随机展现设置的数字个数的元素,元素不删除
srandmember set1 2
spop key [数字] 从集合中随机弹出一个元素,出一个删一个
smove key1 key2 在key1里已存在的某个值 将key1里已存在的某个值赋值给key2
smove set1 set2 2把set1中的2这个值移动到set2,set1中的这个值删除
#### 集合运算
集合a,集合b,
A:abc12
B:123ax
集合的差集运算:A-B 属于a但是不属于b的集合 sdiff set1 set2
集合的并集运算:A∪B 同时属于a和b的集合 sunion key [key]
集合的交运算:A∩B 集合a和集合b都拥有的元素sinter key [key]
sintercard numkeys key [key...] [LIMIT limit]
他不返回结果集,只返回结果的基数,返回由所有给定集合的交集产生集合的基数
基数是去重之后的结果的个数,去重之后结果有三个就是三
sintercard 2 set1 set2
sintercard 2 set1 set2 2只显示两个
案例:可以用在社交工具上,共同好友之类的

5.redis有序集合zset(sorted set)

在set的基础之上,每个val值前加一个score分数值。之前set是k1 v1 v2 v3,现在zset是zset k1 score1 v1 score2 v2...
常用命令:向有序集合中加入一个元素和该元素的分数

  • zadd key score member [score member ...] 添加元素
  • zrange key start stop [withscores] 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素
    withscores参数表示返回内容带着分数
  • zrevrange 反方向的遍历输出
  • zrangebyscore key min max [withscores] [limit offset count] 获取指定分数范围的元素
    示例zrangebyscore zset1 60 90
    示例zrangebyscore zset1 (60 90
    带小括号表示不包含
    withscore 带着分数遍历
    limit的作用是返回的个数
    zrangebyrange zset1 60 90 withscore limit 0 1
    返回一个
    zrangebyrange zset1 60 90 withscore limit 0 2
    返回两个
  • zscore key member获取元素的分数
zscore zset1 v1
  • zcard key获取集合中元素的数量
zcard zset1
  • zrem key value value是某score下对应的value值,作用是删除元素
zrem zset1 v2
  • zincrby key increment member增加某个元素的分数,increment是增加的值,member是被增加的元素
zincrby zset1 5 v2
  • zcount key min max 计算某个范围一共多少值
zcount zset1 60 90
  • zmpop 从键名列表中的第一个非空排序集中弹出一个元素,它们是成员分数对
zmpop 1 zset min count 1
#1代表弹出一个,min是从最小的开始
  • zrank key values作用是获取下标值
    zrevrank key values 逆序获得下标值
zrank zset1 v2
#获取v2的下标

6.redis位图 bitmap

介绍

位图是有01表现得二进制位的bit数组
使用场景:用户是否登陆过,电影是否播放过,打卡签到
bitmap存的内容是字符串,相当于string的子类

基本命令

setbit

setbit key offset value
setbit 键值 偏移值 只能是零和一
偏移量是从0开始

setbit k1 2 1
getbit
getbie key offset
getbit k1 1
strlen

八位一组,每8个位是一个byte

strlen k1
bitcount

统计全部键里面1一共有多少个
bitcount key
bitcount key start end

bitop

比特位的运行操作,操作符:AND,OR,NOT,XOR

#连续两天都签到的用户
#统计一月一号和一月二号都有的用户,结果返回到k3
#设置一个统计每天打卡情况的位图
setbit 20230101 0 1 第零个用户第一天打卡
setbit 20230101 1 1 第一个用户第一天打卡
setbit 20230102 0 1 第零个用户第二天打卡
bitop and k3 20230101 20230102

7.redis基数统计 hyperloglog

介绍

去重复统计功能的基数估计算法
可以用来统计某个网站的uv,统计某个文章的uv
uv:独立访客,某个网站的访客
hyperloglog只会根据输入元素计算基数,并不会存储元素本身,所以hyperloglog不能像集合一样,返回输入的各个元素,只能用作统计
基数:一种数据集,是去重后的真实数据
基数统计:用于统计一个集合中不重复元素的个数,就是对集合去重复后剩余元素的计算。
在去重的过程中会有一些误差

pfadd key element [element]

添加指定元素到hyperloglog中

pfadd hllo1 1 2 2 3 4 4 5 6

pfcount key [key]

返回给定的hyperloglog估算值

pfmerge destkey sourcekey [sourcekey...]

destkey 是合并到的键名
将多个hyperloglog合并

pfmerge destkey hllo1 hllo2

8.redis地理空间geo

介绍

如果不用redis,使用sql查询举例最近的车辆要使用
select taxi from position where x0-r<x<x0+r and y0-r<y<y0+r
将三维的地球转化为二维的坐标,将二维的坐标转化成以为的点块,最后将一维的点块转为二进制然后再通过base32编码
geo是zset的子类

如何获取某个位置的经纬度

从网上查,redis不会产生经纬度

geoadd 多个经度纬度添加到指定的key中
geoadd key longitude latitude member [longitude latitude member...]
geopos 从键里返回所有给定元素的位置(经度和维度)
geopos key member [member...]
geohash返回坐标的hash表示

geohash算法生成base32编码值
二维变一维

geohash key member [member...]
geodist 返回两个给定位置的举例
geodist city member [m|km|ft|mi]
geodist city tiananmen gugong km
georadius 以给定的经纬度为中心,返回要查找的键中与中心的距离不超过给定最大距离的所有位置元素
georadius key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]

radius:距离
withcoord:将位置元素的经纬度一并返回
withdist:返回元素时将元素位置与中心的距离一并返回
withhash:返回元素经过编码后的geohash值
count:限制返回的数量

georadiusbymember 根georadius相似

不用输入经纬度,直接输入一个member单词就能查到要差的数据

9.redis流stream

redis的stream就是redis版本的消息中间件
redis的发布和订阅无法使数据持久化,如果网络断开redis宕机,消息就会被丢弃,也没有ack签收机制保证数据的可靠性,如果一个消费者都没有,数据就被丢弃了
stream实现消息队列,支持消息的持久化,支持自动生成全局唯一id,支持ack确认模式,支持消费组模式等。

过程

生产者产生消息,通过xadd命令添加到stream,xgroup create创建消费组,消费组中的消费者使用xreadgroup命令读取消息,读取消息之后发送xack回执

实现

通过一个消息链表,把所有的消息穿起来
message 消息内容
consumer group 消费组,通过xgroup creat命令创建,同一个消费组可以有多个消费者
last_delivered_id 游标,每个消费组都会有一个游标,任意一个消费者读取了都会使游标后移
consumer 消费者
pending_ids 消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息id,一旦消息被ack,这个id就会减少。redis里面称之为pel,记录了当前已被客户端读取的消息,但是还没有ack,用来确保客户端至少消费了消息一次,而不会在网络传输中丢失了没处理的消息

队列相关指令
xadd 添加消息到队列的末尾

消息id必须比上一个id大
默认用星号表示自动生成规矩,用于xadd命令中,让系统自动生成id
xadd是向stream中添加消息,如果指定的stream不存在,则该命令执行的时候会创建一个stream队列

xadd mystream * k1 v1 k2 v2
"1680846074629-0"
前半部分是毫秒级的时间戳,后面是这个毫秒下生成的消息
xrange

用于获取消息列表,可以指定范围,忽略删除消息,start表示开始,-代表最小值。end表示结束,+代表最大值,count表示最多获取多少值

xrange mystream - +
从小到大输出
xrevrange

反转

xrevrange mystream - +
xdel删除命令

xdel删除的时候按照主键删除

xdel mystream 1680846074629-0
xlen 长度
xlen mystream
xtrim 截取

用于对stream的长度进行截取,如超长会进行截取
maxlen 允许的最大长度,对流进行修剪限制长度,相当于是对长度进行一个限制。
minid 允许的最小id,从某个id值开始比较,该id值小的将会被抛弃,也是相当于保留最新的数据

#截取之后会按照maxlen限制最大的长度,如果后面的数值是2,那么截取之后stream的长度就是2,只保留最新的数据,也就是id最大的数据
xtrim mystream maxlen 2
#类似上面,不过maxlen是使用数量进行修剪,minid使用id进行修剪,都是保留最新数据
xtrim mystream minid 1680847323360-0
xread

用于获取消息(阻塞/非阻塞),只会返回大于指定id的消息

xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

count 最多读取多少条消息
block 是否以阻塞的方式获取消息,默认为不阻塞,如果milliseconds设置为0,表示永远阻塞

xread count 2 streams mystream $
xread count 2 streams mystream 0-0
$代表特殊id,表示以当前stream已经存储的最大的id作为最后一个id,当期stream中不存在大于该id的数据所以返回nil
0-0表示从最小的id开始获取stream中的消息,当不指定count,将会返回stream中的所有消息,也可以使用000/000)也是可以的
xread count 1 block 0 streams mystream $
表示阻塞,直到获取到比当前id更大的数据,这时候另一个会话插入一个新的消息,阻塞获取到数据,阻塞结束。
消费组指令
xgroup creat 创建消费组
xgroup create mystream groupA $
xgroup create mystream groupB 0
$表示从尾开始,但还是只能读最新的,所以读取的是创建消费组之后插入的数据
0表示从头开始
xreadgroup group

“>”表示从第一条尚未被消费的消息开始读取
消费组groupa内的消费者consumer1从mystream消息队列中读取所有的消息,同一个组内的消费者就不能再读了,但是不同消费组的消费者可以读取同一条消息

XREADGROUP group groupa consumer1 streams mystream >
out:
1) 1) "mystream"
2) 1) 1) "1680847323360-0"
2) 1) "k2"
2) "v2"
2) 1) "1680847323972-0"
2) 1) "k2"
2) "v2"
3) 1) "1680848018326-0"
2) 1) "k3"
2) "v3"
4) 1) "1680848019412-0"
2) 1) "k3"
2) "v3"
5) 1) "1680848020190-0"
2) 1) "k3"
2) "v3"
XREADGROUP group groupa consumer2 streams mystream >
out:
(nil)
#同一个消费组内一个消费者读取过得消息,另外一个消费者就不能读取了
#c组中的每个消费者读两条
xreadgroup group groupc consumer1 count 2 streams mystream >
xreadgroup group groupc consumer2 count 2 streams mystream >
xreadgroup group groupc consumer3 count 2 streams mystream >
xreadgroup group groupc consumer4 count 2 streams mystream >
ack机制

如何保证发生故障之后,仍然可以读取未处理完的消息
streams会自动使用内部队列,留存消费组里每个消费者读取的消息保底措施,知道消费者使用xack命令通知stream消息已完成
一般业务完成之后,要使用xack命令确认消息已经被消费完成

xpending

查询每个消费组内所有消费者“已读取但尚未确认”的消息
查看某个消费者具体读取了那些数据

xpending mystream groupc
out:
1) (integer) 7 #一共多少条数据
2) "1680847323360-0" #所有消费者读取的消息最小id
3) "1680850044573-0" #所有消费者读取的消息最大id
4) 1) 1) "consumer1"
2) "2" #已读未确认的数量
2) 1) "consumer2"
2) "2"
3) 1) "consumer3"
2) "2"
4) 1) "consumer4"
2) "1"
#显示每个消费者读取了那些数据
#10是显示10条的意思
xpending mystream groupc - + 10 consumer2
1) 1) "1680848018326-0"
2) "consumer2"
3) (integer) 1087926
4) (integer) 1
2) 1) "1680848019412-0"
2) "consumer2"
3) (integer) 1087926
4) (integer) 1

如果一条消息被处理了,可以使用xack2命令通知stream,然后这条消息就会被删除

xack确认消息读完
xack mystream groupc 1680848018326-0
发送回执
xinfo 打印相关信息
xinfo stream mystream
四个特殊符号

redis位域bitfield

了解即可
将redis字符串看做是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整形位域进行寻址和修改

posted @   niko5960  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示