redis之数据类型

redis的数据类型

redis 是以键值对的形式存储数据的。key 只有字符串一种数据类型,value有8中数据类型。
具体的类型分别是:

  • 1、字符串
  • 2、列表 List
  • 3、散列 hash
  • 4、无序集合 set
  • 5、有序集合 set
  • 6、基数统计 HyperLogLog (2.9新增)
  • 7、地理地图 GEO (3.2 新增)
  • 8、流Stream (5.0新增)
一、字符串类型的用法
  • 字符串是redis中最基础和常用的数据类型,它是二进制安全的。
  • 在redis中字符串键值对中,value的最大长度是512M。
二进制安全

二进制安全是保证你存什么东西就去,取出来的就是什么东西。

字符串类型的基本操作
  • set 将字符串键和值关联
k1 是键,hengheng 是值
set k1 hengheng    
  • setnx 是set 命令的变种,只有当指定的key不存在时才会将value 保存。
setnx k1 hengheng2  //这条不会成功,因为k1 已经存在
setnx k2 hengheng1  //这条执行成功
  • get命令,通过键得到 value
get k1    //得到的是 hengheng
get k2    //得到的是 hengheng1
注: 当指定的key 不存在是,则返回nil
  • del命令 删除一个键值对
del k1   //删除成功返回1,不成功返回0
  • strlen 返回指定键对应值的字符个数
strlen k2    //返回的是hengheng1的字符个数  9
注: 不存在的键则返回的是0
  • append命令 在指定键对应的值后面追加内容,如果键不存在,则新建一个键值对
hhh 是要追加的内容
append k2 hhh  
  • setrange key num value 改变指定键对应value的第num后面的值
setrange k2 2 kkk  //在使用get k2 取出来的value 就是jikkk
  • getset命令 先把指定key对应的值去出来,在把新值覆盖旧值
k2 是 键,enenen  是新值
getset k2 enenen   //返回的是 jikkk  在使用get k2  返回的值是  enenen
  • incr 自增命令
set k3 1
incr k3  //在原来的数值上加1, 如果k3 不存在,则新建一个键值对,在0 的基础上加1
get k3   //2
  • incrby 可以设置增长的间隔
incrby k3 7  // 增长7
  • decr 自减命令
decr k3  //自减1,如果k3 不存在,则新建一个键值对,在0 的基础上减1
  • decrby 设置减小的间隔
decrby k3 3  //减少3
二、list 列表

list(列表)不是基于数组实现的,是基于双向链表结构的

  • lpush 命令 在列表的左端插入
lpush list1 a b c d   //得到的list1 是  d c b a
  • rpush 命令 在列表的右端插入
rpush list2 a b c d   //得到的结果是 a b c d
  • del 删除列表
del list1
  • lrange 命令 获取指定的值
list2是列表名,1是开始的位置,3 是结束的位置
lrange list2 1 3 // 返回 b c d
lrange list2 1 -1 // 返回 b c d 
注:startend  都是基于0 的下标,即list 的第一个元素是0,最后一个是-1 
  • linsert listname after/before value newvalue 在指定的value值后面或前面追加值
linsert list2 after a i
linsert list2 before c k
lrange list2 0 -1
  • lindex listname index 获取执行list列表中指定索引上的值
lindex list2 2
  • lpop/rpop listname 删除列表中的元素
lpop list2  //删除了d
rpop list2   //删除了a
注:redis的列表中没有空列表这个概念,当里面的元素都删除了之后,这个列表也就自动删除了
  • llen listname 获取列表的长度
llen list2
  • lrem key count value 删除指定的元素
lrem list2 3 d 
注: 如果count>0,从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
    如果count<0, 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
    如果count=0,移除表中所有与 value 相等的值。
  • lset key index value 替换指定索引的值
lset list2 1 l
  • rpoplpush 在一个链表的尾巴上弹出一个元素,然后又把弹出来的元素,插入到新的链表的头上
a、存在两个不同的链表
> rpush list1 a b c d
> rpoplpush list1 list2   #把list1的尾巴上的元素弹出,插入到list2的头部,一次执行就是一个元素
b、只存在一个链表 
> rpush list1 a b c d
> rpoplpush list1 list1   #从list1尾巴上的元素弹出,插入list1的头部,一次执行一个元素
三、 hash 哈希

hash的 数据结构是:

key       value 
redisKey  hashkey-value  
  • hset rediskey key value 赋值
hash1 是redis的key,k1 是hashkey
hset hash1 k1 vvv
hset hash1 k1 aaa   //会覆盖前面的
  • hget rediskey key 获取hash
hget hash1 k1 
  • hmset可以一次设置多个键值对
hmset hash2 name hengheng age 18 sex man
  • hgetall 到的所有的键值对
hgetall hash2
  • del 删除redis的key
del hash2
  • hexists rediskey key 判断rediskey中key存在不,存在返回1,不存在返回0
hexists hash2 name
  • hlen rediskey 返回rediskey中包含的key数量
hlen hash2
  • hkeys key 获取所有的字段
hkeys hash2

*hvals key 获取所有value

hvals hash2
四、无序集合

集合里的元素是不能重复的,没有顺序的对象

  • sadd 添加元素 ,重复的数据插入不进去的
sadd set1 a b c d a   //最后一个a 没有插入
  • smembers 获取所有的元素
smembers set1
  • srem key value 删除指定元素
srem set1 a
  • scard 集合元素的个数
scard set1
  • SRandMember
随机返回一个元素,但并不删除
如果不填写返回个数,默认是1,如果填写的数字大于集合的size,那么返回集合的所有元素
如果填写的是负数,如果绝对值大于集合的size,那么返回值里会出现一个元素多次出现的情况。
如果key不存在,则返回empty list or set
srandmember set1 
srandmember set1 2
srandmember set1 -2
  • smove 将一个集合中某个元素删除并添加到另一个集合中
smove set1 set2 b 
  • spop 从集合中随机移出元素
2 表示的是移出元素的个数
spop set2 2
  • sismember:判断元素是否在集合中,如果存在 返回1,否则返回0
sismember set1 c
  • 集合 并/交/差运算
sadd set1 a b c d 
sadd set2 b c e f
sadd set3 1 2 3 4
SUNION:集合并运算
SUNION set1 set2
SUNIONSTORE:求并集后存到一个新的集合(如果结果集存入到已有的集合,那么会覆盖原集合中的数据)
SUNIONSTORE set3 set1 set2   # 把set1和set2的并集覆盖掉set3集合
SUNIONSTORE set4 set1 set2   # 把set1和set2的并集保存到新集合set4
sinter/sinterstore:对几个集合求交集,用法同上SUNION/SUNIONSTORE
sdiff/sdiffstore:求集合的差集,用法同上SUNION/SUNIONSTORE
五、set 有序集合

集合里的元素是不可以重复,但是有顺序,赋值的时候需要手工的给每个元素赋一个分数,排序就是通过这个分数进行的。

  • zadd [key] [score1] [value1] [score2] [value2] […] 添加元素
zadd oset1 1 a 2 b 3 c 4 d 5 e 6 f
  • zrange [key] [indexStart] [indexEnd] {withscores} 找到指定索引取出数据
ZRANGE oset1 0 -1 WITHSCORES            # 显示整个有序集成员
ZRANGE oset1 0 200000         # 测试 end 下标超出最大下标时的情况,列出所有成员  (这个是不带scores的,只有元素的值)
ZRANGE oset1 2000  3000  WITHSCORES     # 测试当给定区间不存在于有序集时的情况,(empty list or set)
  • zrangebyscore [key] [scoreStart] [scoreEnd] {withscores} 按照score范围取出相应的元素数据
ZRANGEBYSCORE oset1 -inf +inf               # 显示整个有序集
ZRANGEBYSCORE oset1 -inf +inf WITHSCORES    # 显示整个有序集及成员的 score 值
ZRANGEBYSCORE oset1 -inf 5 WITHSCORES    # 显示分数 <=5 的所有成员
ZRANGEBYSCORE oset1 3 5            # 显示元素是分数大于等于 3并且 小于等于 5 的成员
  • zscore [key] [value] 获得某个元素的分数
zscore oset1 a 
  • zrank [key] [value] 获得某个元素对应的索引值从0开始,第一个元素对应的值是0
zrank oset1 a  //返回0
  • zrevrank [key] [value] 获得某个元素排名第几,倒序,rev就是反转,不管是正向还是倒向,都是从0开始
zrevrank oset1 c
  • zrem 根据值删除元素
zrem oset1 a b c
  • zremrangebyscore [key] [min] [max] 按照score范围之进行删除
ZREMRANGEBYSCORE oset1 1 2
  • zremrangebyrank [key] [min] [max] 按照索引范围进行删除
zremrangebyrank oset1 0 1
  • zcard 统计数量
zcard oset1
  • zcount [key] [min] [max] 按照score范围进行统计数量
zcount oset1 1 3 //返回3
  • zinterstore [newKey] [numberKeys] [key1] [key2] aggregate [sum/min/max]
zadd set1 100 a 200 b 300 c 400 d
zadd set2 1000 a 2000 b 3000 e 4000 f
ZINTERSTORE res 2 set1 set2 aggregate sum   #求set1和set2的交集,并交集的元素的分数求和
ZINTERSTORE res1 2 set1 set2 weights 2 1 aggregate sum  #在上面的基础上加权重
六 HyperLogLog类型 计数统计

HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值:
• 基数:集合中不同元素的数量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基数就是 3 。
• 估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。
HyperLogLog 的优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和用集合统计时,元素个数越多耗费内存就越多形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog 不能像集合那样,能返回输入的元素本身。

  • PFADD key element [element …] 添加元素
pfadd unique::ip::counter '192.168.32.5'
  • pfcount key[key] 返回给定 HyperLogLog 的基数估算值
pfcount unique::ip::counter
当只给定一个 HyperLogLog 时,命令返回给定 HyperLogLog 的基数估算值。当给定多个 HyperLogLog 时,命令会先对给定的 HyperLogLog 进行并集计算,得出一个合并后的HyperLogLog ,然后返回这个合并 HyperLogLog 的基数估算值作为命令的结果(合并得出的HyperLogLog 不会被储存,使用之后就会被删掉)
  • PFMERGE destkey sourcekey [sourcekey …] 合并多个 HyperLogLog的单独命令
将多个 HyperLogLog 合并为一个 HyperLogLog ,并把合并的结果保存起来
PFADD str1 "apple" "banana" "cherry"
PFADD str2 "apple" "cherry" "durian" "mongo"
PFMERGE str1&2 str1 str2
七、地理地图GEO类型的用法

地理位置主要提供了6个命令,分别为:
GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

1.GEOADD
命令:GEOADD key longitude latitude member [longitude latitude member …]
命令描述:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

geoadd cityGeo 116.405285 39.904989 “beijin”
geoadd cityGeo 121.472644 31.231706 “shanghai”

2.GEODIST
命令:GEODIST key member1 member2 [unit]
命令描述:
返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:

m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
geodist cityGeo 北京 上海 km
  • 命令:GEOPOS key member [member …]
命令描述:从key里返回所有给定位置元素的位置(经度和纬度)。
返回值:GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。当给定的位置元素不存在时, 对应的数组项为空值。
geopos cityGeo 北京
  • 命令:GEOHASH key member [member …]
命令描述:现在很多APP都有搜索附近的功能,比如附近的人、附近的店铺等。要实现这样的功能,我们可以用最笨的方法:根据经纬度计算距离,然后划定一个阈值,只要小于该阈值就算是附近的。这种方法在数据量小时基本没问题,但是,如果数据量特别大,那服务器就需要进行大量的计算,负担很重!为了解决这一类问题,一个比较常用的方法就是利用GeoHash。 
GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。GeoHash具有以下特点: 
1、GeoHash用一个字符串表示经度和纬度两个坐标。
2、GeoHash表示的并不是一个点,而是一个区域; 
3、GeoHash编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索 
GeoHash的计算过程分为三步:
1、将经纬度转换成二进制:
比如这样一个点(39.923201, 116.390705) 
纬度的范围是(-9090),其中间值为0。对于纬度39.923201,在区间(090)中,因此得到一个1;(090)区间的中间值为45度,纬度39.923201小于45,因此得到一个0,依次计算下去,即可得到纬度的二进制表示,如下: 10111000110001111001 
同理可以得到经度116.390705的二进制表示为: 11010010110001000100 

2、合并纬度、经度的二进制:从高到低,奇数位是经度,偶数位是纬度,合并经纬度编码:
11100 11101 00100 01111 00000 01101 01011 00001
3、按照Base32进行编码
geohash cityGeo 北京
  • 命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
命令描述:
根据给定的经纬度为中心,返回半径不超过指定半径距离的所有位置元素
半径可以使用以下其中一个单位:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
可以指定ASCDESC,根据距离来排序
ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 
可以指定COUNT限定返回的记录数
返回值:
在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。
在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字以浮点数格式返回的中心与位置元素之间的距离
georadius cityGeo 116.405285 39.904989 100 km WITHDIST WITHCOORD ASC COUNT 5
  • GEORADIUSBYMEMBER
命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
命令描述:这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的。
georadiusbymember cityGeo 北京 100 km WITHDIST WITHCOORD ASC COUNT 5
八 Stream类型的用法

Stream是Redis 5.0引入的一种新数据类型。它是一个新的强大的支持多播的可持久化的消息队列,作者坦言Redis Stream狠狠地借鉴了Kafka的设计
Redis Stream的结构有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容。消息是持久化的,Redis重启后,内容还在。

  • 添加操作 XADD stream_name id key-value [key-value …]
stream_name:给流指定一个名字
id:entry在流中的标识,entry可以理解为添加到流中数据的封装
id一般来说都使用自增的序列,而不需要自己手动指定,有两部分组成:<millisecondsTime>-<sequenceNumber>。
在命令行中执行XADD命令后,会将自动生成的ID返回并输出。
命令行单条执行,*号表示服务器自动生成ID,后面顺序跟着一堆key/value

XADD mytopic * acctid 123 content 10
XADD mytopic * acctid 234 content 11
  • xlen 查看长度
xlen mytopic
  • xrange(正向) xrevrange(反向) 获取数据
xrange 获取消息列表,会自动过滤已经删除的消息
xrange mytopic - +    # -表示无穷小, +表示无穷大, 当然也可以把-  +  换成具体id值
xrevrange mytopic + 1527837440632 count 3
该命令的意思为:反向查询ID以无限大为开始,以1527837440632为结束的entry,但只取出查询结果集(降序排列)中的前三个entry
  • Xdel key id 根据id 删除信息
xdel mytopic 1592921001493-0
  • xread 可以阻塞客户端的获取数据
XADD mystream * acctid 123 content  10
XADD mystream * acctid 456 content 11
XADD mystream * acctid 789 content 12
# 从Stream头部读取两条消息
xread count 2 streams mystream 0   #和上面xrange 一样不带阻塞
# 获取比mystream 尾部最后一条消息的id还大的消息,毫无疑问,这里不会返回任何消息

xread count 1 streams mystream $      #"$"(特殊ID:该stream中此刻最大ID)
在这句命令的基础上,可以实现阻塞等待
 xread block 0 streams mystream  $   #block 0:block表示命令要阻塞,0表示阻塞时间为无限大
什么意思?就是开启一个监听,让客户端等在这里,直到获取到了一个比当前Stream里所有元素的id都大的新元素后结束!
# 我们从新打开一个窗口,在这个窗口往mystream里塞消息

xadd mystream * acctid 7119 content 15
# 再切换到前面的窗口,我们可以看到阻塞解除了,返回了新的消息内容

1) 1) "mystream"
   2) 1) 1) "1557240340030-0"
         2) 1) "acctid"
            2) "7119"
            3) "age"
            4) "15"
(46.39s)
# 而且还显示了一个等待时间,这里我们等待了46.39s
block 0表示永远阻塞,直到消息到来,block 1000表示阻塞1s,如果1s内没有任何消息到来,就返回nil
九 键管理的常用命令
  • dbsize 查看redis中有多少条记录
dbsize
  • keys * 列出redis中所有数据的key,也可以用命令:> scan 0
  • del mystream 通过redis的key删除指定的数据,4.0以后也可以用命令:> unlink mystream
  • exists key判断一个redis的key是不是存在
  • del mystream 通过redis的key删除指定的数据,4.0以后也可以用命令:> unlink mystream
  • type key 获取redis的key对应的value值的类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值