Redis学习(二)之五大基本数据类型和三种特殊数据类型


PS:redis不区分大小写命令,且会自动识别String,value值可以不加双引号

五大基本数据类型

一、String

#操作数据库
select 1 #进入编号为1的数据库,redis一共有16个数据库,编号从0~15
flushdb #清空数据库
flushall #清空所有数据库
move key1 1 #移动一个key到另一个数据库

#增、改
set key1 "hello" #设置指定的key
#查
get key1 #获得指定的key
keys * #获得所有的key
exists key1 #判断某一个key是否存在
#删
del key1 #删除指定的key

expire key1 10 #设置key的有效时间单位秒
ttl key1 #获取key的当前有效时间

type key1 #获取key的存储类型
append key1 ",redis" #追加字符串,如果key不存在,就相当于set key
strlen key1 #获取当前字符串长度
**************************************************************
incr key1 #自增1
decr key1 #自减1 
incrby key1 10 #当前key值加上指定值
decrby key1 10 #当前key值减去指定值

getrange key1 0 3 #截取字符串[0,3]
getrange key1 0 -1 #获取全部字符串和 get key 是一样的
setrange key1 1 xx #替换指定位置开始的字符串
setex key1 10 "hello" #(set with expire)设置值和过期时间
setnx key1 "hello" #(set if not exist)如果key不存在则创建key并设值
mset k1 v1 k2 v2 k3 v3 #同时设置多个值
mget k1 k2 k3 #同时获取多个值
msetnx k1 v1 k4 v4 #如果不存在则创建多个对应的k-v对。msetnx是原子性操作,要么一起成功,要么一 起失败

#保存一个对象
set user:1 {name:zhangsan,age:3} #{xxx}为JSON格式的字符串
set user:1:age 18  #user:{id}:{filed} 设置id为1的user对象age为18

#组合语句
#先get再set
getset db "redis" #如果不存在值则返回null,如果存在则获取原来的值并设置新值(可用于更新)

String类似的使用场景:value除了是字符串还可以是数字

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

二、List

再redis里,list可以玩成栈、队列、阻塞队列
所有的list命令都是L或R开头的

#增
lpush list1 one #将一个或多个值插入到列表头部(左)
rpush list1 one #将一个或多个值插入到列表尾部(右)
linsert list1 before(after) world other #将某个值插入到列表中某个值的前面或后面
#查
lrange list1 0 2 #获取指定范围的值
lrange list1 0 -1 #获取所有值
#删
lpop list1 #移除列表第一个元素(左)
rpop list1 #移除列表最后一个元素(右)
lpop(rpop) list1 2 #移除列表指定个数的元素
lrem list 1 one #移除list中指定个数的value,精确匹配,若数值为0则移除所有
#改
lset list1 0 item #将列表中指定下标的值替换为另一个值(更新),先判断该list是否存在,不存在就会报错,存在就会替换当前值

ltrim list 1 2 #通过下标截取指定长度的list
lindex list1 1 #通过下表获取list中的某一个值
llen list1 #返回列表长度

#组合命令
rpoplpush list1 list2 #移除列表的最后一个元素,将他移动到新的列表中

  • 实际上是一个链表,before Node after,left,right都可以插入值
  • 如果key不存在,创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在
  • 在两边插入或改动值,效率最高;中间元素,效率会相对低一点

消息排队,消息队列(Lpush,Rpop),栈(Lpush,Lpop)

三、Set

set中的值是无序的不能重复的

#增
sadd set1 hello #往set中添加元素
#查
smembers set1 #查看指定set的所有值
sismember set1 hello #判断某一个值是否再set中
#删
srem set1 hello #移除set集合中的指定元素

scard set1 #获取set集合中的元素个数

srandmember set1 2 #随机抽选出指定个数的元素,若不写个数默认为1

spop set1 #随机删除并获取一个set集合中的元素

smove set1 set2 hello #将一个指定的值移动到另一个set集合

sdiff set1 set2 #差集
sinter set1 set2 #交集
sunion set1 set2 #并集

微博,B站,共同关注

  • 差集
  • 交集
  • 并集

四、Hash

Map集合,key-map,这时候的value是map集合。本质与String类型没有太大区别,还是一个简单的key-value

#增、改
hset hash1 name zhangsan
hmset hash1 name zhangsan age 18 #批量增
#查
hget hash1 name
hmget hash1 name age #批量查
hgetall hash1 # 获取全部的数据
#删
hdel hash1 name #删除hash指定key字段,对应的value也会删除

****************************************************************************
hlen hash1 #判断hash表的字段数量

hexists hash1 name #判断hash中指定字段是否存在

hkeys hash1 #获取所有的field
hvals hash1 #获取所有的value

hincrby hash1 age 1 #指定增量

hsetnx hash1 name hello #如果不存在则可以设置,如果存在则不能设置

hash变更数据user,name,age,尤其是用户信息之类的,经常变动的信息,hash更适合于对象的存储,String更适合字符串存储。

五、Zset

Zset为有序集合,再set的基础上增加了一个值。
set k1 v1
zset k1 score v1

#增
zadd zset1 1 one 
zadd zset1 2 two 3 three #批量增
#查
zrange zset 0 -1
#删
zrem zset1 one 

zcard zset1 #获取有序集合中的个数
*****************************************************************************************
#排序
zrangebyscore zset1 -inf +inf #显示全部用户从小到大排序
zrangebyscore zset1 -inf +inf withscores #显示全部用户从小到大排序并显示score值

zrevrange zset1 0 -1 #从大到小进行排序
******************************************************************************************
zcount zset1 1 3 #获取指定区间的成员数量

存储班级成绩表,工资表排序,带权重进行判断,排行榜

三种特殊数据类型

一、Geospatial

geospatial -> 地理位置
定位、附近的人、打车距离计算

#有效的经度从-180度到180度。
#有效的纬度从-85.05112878度到85.05112878度。
#geoadd 增
geoadd china:city 116.40 39.90 beijing

#geopos 查
geopos china:city beijing

#geodist 两地之间距离
geodist china:city beijing shanghai km 
# m 表示单位为米。
# km 表示单位为千米。
# mi 表示单位为英里。
# ft 表示单位为英尺

#georadius 以给定的经纬度为中心,找出某一半径内的元素
georadius china:city 110 30 1000 km #以110 30这个经纬度为中心寻找方圆1000km内的城市

#georadiusbymember 找出位于指定元素周围的其他元素
georadiusbymember china:city beijing 1000 km

#geohash 将二维的经纬度转换为一维的字符串,该命令将返回11个字符的字符串
geohash china:city beijing
#返回两个字符串,两个字符串越接近,那么距离越近
geohash china:city beijing shanghai

GEO底层实现原理就是Zset,可以使用Zset命令操作geo

二、Hyperloglog

什么是基数? 去重后的元素个数

Redis Hyperloglog 基数统计的算法
优点:占用的内存是固定的,2^64不同的元素的基数,只需要12KB内存,从内存方面比较,Hyperloglog是首选

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

pfcount mykey #统计mykey元素的技术数量

pfmerge mykey3 mykey mykey2 #合并两组 mykey mykey2 => 并集

官方统计会有0.81%错误率,统计UV(独立访客统计),可以忽略不计
如果允许容错,那么一定可以使用Hyperloglog

三、Bitmaps

位存储:只有0和1

统计用户信息、活跃或不活跃、登录或未登录、打卡未打卡。两个状态的,都可以使用Bitmaps
Bitmaps 位图 ,数据结构。都是操作二进制位来进行记录,就只有0和1两个状态

例:记录周一到周日的打卡

#增加打卡记录
setbit sign 0 1
setbit sign 1 0
setbit sign 2 1
setbit sign 3 1
setbit sign 4 1
setbit sign 5 1
setbit sign 6 1
#查询某天打卡记录
getbit sign 3
#统计打卡天数,为1就算打卡,会统计值为1的数量
bitcount sign 

下一篇

Redis学习(三)之Redis的事务和乐观锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值