Redis随笔---五种基本数据类型和三种特殊数据类型

本文详细介绍Redis五大基本数据类型的常用命令,包括String、List、Set、Hash及Zset等,并覆盖了Geo、HyperLogLog和Bitmap等高级特性。此外,还介绍了Redis的发布订阅功能。
摘要由CSDN通过智能技术生成

基础操作

1.redis有16个数据库,使用命令< select * > 切换数据库

2.keys * 查询全部key

3.清空当前的数据库的内容:flushdb

4.清空全部数据库的内容:flushall

五大数据类型

1).string类型

1.判断当前key是否存在:exists key

2.移除指定数据库内的key:move key 1

3.设置key的过期时间,单位是秒:expire;查看当前key的剩余时间 :ttl key

4.查看当前key的类型:type key

5.set key 0 incr key #自增1

​6.decr key # 自减1

7.incrby key 10 #加指定数量(步长)

​8. decrby key 10 #减指定数量(步长)

9.截取字符串指定地址:getrange key 0 3(-1,全部) 替换指定位置开始的字符串:setrange key 1 xx

10.设置key带有过期时间:setex(set with expire) setex key 30 “HELLO”(和expire 区别是:expire必须存在这个key才能设置过期时间 )

11.不存在再设置:setnx(set if not exist) setnx key “redis” —> 1 setnx key “MongoDB” —> 0

12.批量set与get mset k1 v1 k2 v2 k3 v3 mget k1 k2 k3 msetnx k1 v1 k2 v4 #原子性,要么全部成功,不然全部失败

13.存在值则获取原来的值,并设置新的值 getset key “redis”

2).List类型

1.所有指令都是以L 开头 LPUSH list one #将一个值或者多个值,插入到列表头部(左)

​2.RPUSH list one #将一个值或者多个值,插入到列表头部(右)

3.LRANGE list 0 1 通过区间获取具体的值

​4. LRANGE list 0 -1 获取list全部的值

5.LPOP list 移除列表的第一个元素 (或者说是移除队列最左边元素)

6.RPOP list 移除最后一个元素(或者说是移除队列最右边元素)

6.通过获取list某一个值 : Lindex list 1

7.获取列表的长度: Llen list

8.移除列表指定个数的值:lrem list 1 one

9.通过下标截取指定的长度:Ltrim list 1 2 (list会被改变)

10.移除列表最后一个元素到新的列表中:rpoplpush list1 1 list2

11.将指定下标的值更新成为另外的值,更新操作(如果不存在则会报错): lset list 0 item

12.将某一个具体的值插入到列表中插入到指定值得前面或后面:linsert list before “value1” “value2”

小结:实际上是一个链表,before node left,两边都可以插入值。消息队列(Lpush Rpop),栈(Lpush Lpop)

3).Set类型:set类型中元素不可以重复

​1.sadd set1 1 2 3 4 #set集合中添加元素

2.smembers set1 #查询集合所有内容

3.sismember set1 1 #查询set中是否存在某个元素(1:存在,0不存在)

​4.scard set1 #获取set集合中个数

5.srem set1 1 #移除指定元素

6.srandmember set1 1 #随机获取一个元素

​7.spop set1 #随机移除一个元素

8.smove set1 set2 “值” #移动指定的值到新的集合中

9.sdiff set1 set2 #差集

10.sinter set1 set 2 #交集 共同好友

11.sunion set1 set2 #并集

4).Hash类型

当作Map集合,key-map(或者key-),值是Map集合

(hash1:哈希 filed1:哈希中一个key hello:哈希中一个key对应的value)

1.hset hash1 filed1 hello #set一个具体的key-vlaue

2.hget hash1 filed1 #获取一个字段值

3.hmset hash1 filed1 hello1 filed2 hello2#set多个具体的key-vlaue

4.hmget hash1 filed1 filed2#获取多个字段值

5.hgetall hash1 #获取hash1 所有字段值

6.hdel hash1 filed1 #删除hash1指定的key(filed1 )字段,与key对应的value也删除了

​7.hlen hash1 #获取hash1长度

8.hexists hash1 field1 #判断hash1中的key是否存在

9.hvals hash1 #获取指定hash1所有的值

10.hset hash1 filed1 1 #指定增量

11.hincrby hash1 filed1 n #n>0自增,例如1;n<0自减,例如-1

12.hsetnx hash1 filed1 hello #如果不存在可以设置成功;如果存在则不能设置

5).zset类型(有序集合)

​在set的基础上,增加了一个序号值:
set: sadd k1 v1
zset: zadd k1 score v1(score可以是1,2,3这些)

1.zadd zset1 1 one #添加一个值

2.zadd zset1 2 two 3 three #添加多个值

3.zrange zset1 0 -1 获取zset所有值

4.zrangebyscore zset1 -inf +inf #把所有从小到大排序(one,two ,three )
语法:zrangebyscore key min max

5.zrangebyscore zset1 -inf +inf withscores #把所有从小到大排序并带上score(one,1,two,2,three,3)

6.zrevrange zset1 0 -1 #把所有从大到小排序(three,two ,one )

6.zrem zset1 one #移除指定的元素

7.zcard zset1 #获取有序集合zset1的个数

8.zcount zset1 1 3#获取指定区间的成员数量

三种特殊数据类型

1).Geospatial地理位置

有效的经度:-180度到180度
有效的维度:-85.05112878度到85.05112878

1.geoadd #添加地理位置,南北两极无法直接添加,一般会下载数据,直接通过JAVA程序一次性导入,geoadd key 经度 维度 城市名称
geoadd china:city 116.40 39.90 beijing

2.geopos china:city beijing #获取指定城市的经度维度,获得当前定位

3.geodist #两点之间的距离,两人之间的距离
单位:
m:米(不指定默认为米)
km:千米
mi:英里
ft:英尺
geodist china:city beijing shanghai #查询结果多少米
geodist china:city beijing shanghai km #查询结果多少千米

4.georadius #以给定的经纬度为中心,查询某一半径内的元素(附近的人)
georadius china:city 110 30 500 km #查询出以经纬度(110,30)为中心附件500千米的城市
georadius china:city 110 30 500 km withdist #查询出以经纬度(110,30)为中心附件500千米的城市,并显示直线距离
georadius china:city 110 30 500 km withcoord #查询出以经纬度(110,30)为中心附件500千米的城市,并显示查出记录的经纬度
georadius china:city 110 30 500 km count 2 #查询出以经纬度(110,30)为中心附件500千米的城市,并显示查询结果中两条记录
georadius china:city 110 30 500 km withdist withcoord count 2 #查询出以经纬度(110,30)为中心附件500千米的城市,并显示直线距离,记录的经纬度,及查询结果中两条记录

5.georadiusbymember #查询指定元素周围多少距离的其他元素
georadiusbymember china:city shanghai 500km #查询上海500km范围内的其他城市

6.geohash china:city bejing #返回一个或多个位置元素的geohash表示,将返回11个字符的Geohash字符串,两个字符串越接近代表距离越近

GEO底层的实现原理其实就是zset!可以用zset命令来操作geo
场景应用:可用于 实现 获取某个地点的坐标、计算两个地点的直接距离、某个地点坐标多少范围内的地点有哪些等等

(类似现实生活中的附近的人功能)

底层:Geospatial 底层其实是 zset 可以用zset命令操作geo
zrange china:city 0 -1 #查询所有元素
zrem china:city beiing #移除指定元素

2).HyperLogLog
Redis HyperLogLog 是用来做基数(不重复的元素,可以接受误差)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的(2^64,12KB内存)、并且是很小的。0.81%错误率,统计网页UV时可以忽略不计。

1.pfadd mykey a b c d e f g h i j #创建第一组元素mykey

2.pfcount mykey #统计第一组mykey基数,结果为10

3.pfadd mykey2 i j k l m n a b #创建第二组元素mykey2

4.pfcount mykey2 #统计第二组mykey2基数,结果为8

5.pfmerge mekey3 mykey mykey2 #合并两组mykey ,mykey2到mykey3,并集

6.pfcount mykey3 #统计第三组并集mykey3基数,结果为14,里边包含(a,b,c,d,e,f,g,h,i,j,k,l,m,n)

3).Bitmap位存储

场景应用: 统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用Bitmaps!

优点:Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!

365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

1.setbit key1 0 1 #setbit key offset value(value只有0或者1),设置(比如周一到周末打卡情况)

2.getbit key1 0 #getbit key offset,获取(比如查看某一天打卡情况)

3.bitcount key1 #bitcount key [start end]统计数据(比如统计这周key1的打卡情况)

Redis发布订阅

1.subscribe channel[channel …] #订阅一个或者多个频道

2.publish channel message #将消息(message)发布到指定的频道(channel)

3.psubscribe pattern [pattern …] #订阅一个或者多个符合给定模式的频道

4.pubsub subcommand [argument [argument …]] #查看订阅与发布系统状态

5.punsubscribe [pattern [pattern …]] #退订所有给定模式的频道

6.unsubscribe [channel [channel …]] # 退订指定的频道

测试:

订阅端:

127.0.0.1:6379> subscribe daidai   	#订阅一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "daidai"
3) (integer) 1
#等待消息推送
1) "message"	#消息
2) "daidai"		#哪个频道的消息
3) "hello,daidai!"		#具体消息的的内容

1) "message"
2) "daidai"
3) "xiaoyueliang!"

发布端:

127.0.0.1:6379> publish daidai hello,daidai!	#发布者发送消息到频道
(integer) 1
127.0.0.1:6379> publish daidai xiaoyueliang!	#发布者发送消息到频道
(integer) 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值