Redis教程(三)Redis数据类型介绍与使用

TangLu Redis 2019-10-15 3701 0

Redis常用的数据类型有字符串类型、哈希类型、集合类型、有序集合类型与列表类型,新版本中又新增GEO、STREAM等类型,合理使用正确的数据类型,可以有效的降低开发工作,对于在MySQL中一些需要复杂SQL才能完成的工作,在Redis中通过一条简单命令即可实现。


· 字符串类型

字符串数据类型可以用于多种场景,但是单个Key的值不能超过512M。通常运用于分布式系统的session会话缓存共享、浏览计数器等,比如直播时的浏览量就可以使用incr、decr来实现,刷礼物时通过incrby命令来实现。字符串类型有点万金油,但是由于它需要额外的空间来记录数据长度、内存使用等元数据,当实际保存的数据本身很小时,元数据的空间开销反而显得就很大了

对字符串类型的操作可以查看《Redis教程(二)Key的通用操作与常用服务管理命令》一文


· Hash类型

常当作数据库缓存使用,如商品购物车、用户或者产品的详情信息。哈希类型的数据适合存储对象,其数据结构有点像MySQL表中的一行数据,包含了多个字段。MySQL是一张表里存放了多个字段和值,而Redis的Hash类型就是一个key里存放了多个字段和值。由于一个Hash对应一个集合的数据,但是也只使用一个dictEntry来存储元数据,所以会比字符串类型的数据更节省内存空间


1、设置Redis Hash Key

# hset key field value
# hsetnx key field value
# hmset key field1 value1 field2 value2
hset student1 name tanglu age 30  #设置一个hash key,名为student1,然后添加了name和age两个字段
hset student1 sex male  #新增一个sex字段,值位male
hmset student1 height 175 weight 70  #一次新增多个字段


2、获取Redis Hash Key元素个数

# hlen key
hlen tanglu  #显示结果为4,因为上面示例设置了age sex height weight一共4个字段

# hget key filed
# hmget key field1 field2  #获取多个值
hget student1 name  #获取指定字段的值,get的时候必须写清楚表名和字段名
hmget student1 height weight


3、获取Hash Key所有字段的值,同keys命令一样需谨慎使用

hgetall key  #显示出该Hash类型的key下的所有字段和值,谨慎使用
hkeys key  #仅显示该Hash类型的key下的所有字段
hvals key  #和上一步相反,显示的是具体的值


redishash.png


4、删除Hash Key中指定的字段和值

hdel key field1 field2...


5、判断Hash Key字段是否存在,返回1代表存在,0代表不存在

hexists key field  #一次只能跟一个字段
hexists student1 address


· Redis list类型

list列表类型的数据一般用于消息队列(比如使用redis作为ES的消息队列,当发现ES没有日志进来的时候,可以先看redis消息队列中是否有数据),可以让一个key拥有多个value,且值可重复

lpush names tanglu  #从左边开始插入数据
lpush names tom
lpush names tanglu  #故意定义了重复的value
lrange names 0 -1  #获取列表里的全部值,0和-1是起始和结束范围,后进入的key的值反而是在前面的
lrange names 0 1  #获取第一个和第二个值
lrem names 1 tanglu  #移除一个值为tanglu的列,这里将会按照序号移除。如果要移除所有的话,序号写0
lpop names  #按照后进先出的方式读取列表里的数据,可当做消息队列
rpop names  #先进先出
del names  #删除列表

blpop   #lpop的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被阻塞,直到有另一个客户端对该key执行LPUSH或RPUSH


· Redis集合

分为了有序集合(zset)和无序集合(set),集合内的元素都不可重复。无序集合通过交集、差集或并集获得需要的数据,常用于社交软件共同好友、微博圈子。区别在于有序集合的每一个成员都关联一个评分(score),可以根据这个评分对集合中的成员进行排序,成员虽然是唯一的,但是评分可以重复,常用于做排行榜场景。

#无序集合
sadd ages 25
sadd ages 30
sadd ages 32
sadd ages 25  #重复定义,会添加失败
smembers ages  #显示集合中的元素,由于是无序的,不用再指定序号
srem ages 25  #移除一个元素
sismember ages 30  #检查集合中有没有30这个元素


#有序集合
zadd students_top3 tanglu 100 zhangsan 90 lisi 85   
zrange students_top3 0 -1  #会根据评分对成员自动排序 
zrank students_top3 tanglu  #返回1,因为分数排名第一


· HyperLogLog

该数据类型主要用于对一些海量数据进行统计,并且只会消耗少量的空间(12K的空间可以统计出2^64的数据)。比如统计数千万级别的访问请求中的独立IP数

pfadd test "redis"  #返回1,成功添加数据
pfadd test "mysql"  #返回1,成功添加数据
pfadd test "mysql"  #返回0,因为重复了
pfcount test #返回2,代表有2个不同的数据
pfmerge test3 test1 test2  #将test1和test2的数据合并到test3


· GEO类型

该数据类型根据设置的经纬度可以算出地理位置信息以及不同位置的距离,还可以统计出某范围内的成员,比如很多APP上附近的人就可以用该功能实现,而经纬度信息可以通过百度地图等工具进行查询

#设置2个包含经纬度的key
geoadd site 116.404269 39.913411 tiananmen      #设置了tiananmeng的经纬度
geoadd site 116.36 39.922461  yuetangongyuan

#查询
geopos site tiananmen

#距离计算,可选m或km等单位
geodist site tiananmen yuetangongyuan km

评论