Redis学习笔记1_数据类型


Redis常用数据类型


一、数据类型

概述

对于Redis来说,所有的 key 都是字符串。我们谈论5种value的数据类型。分别是:String,List,Set,Zset,Hash。

请添加图片描述

结构类型结构存储的值结构的读写能力
String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作
List列表一个链表,链表上的每个节点都包含一个字符串对链表的两端进行push和pop操作,读取单个或者多个元素;根据值查找或删除元素
Set集合包含字符串的无序集合字符串的结合,包含基础的方法,例如看是否存在添加、获取、删除;计算交集、并集、差集等
Hash散列包含键值对的无序散列表方法:添加、获取、删除单个元素;获取所有的键值对元素
Zset有序集合和Hash相同,存储键值对字符串成员和浮点数之间的有序映射;元素的排列由分数(score)大小决定;方法:添加、获取、删除单个元素,根据score范围或成员获取元素

String字符串

String是Redis中最基本的数据类型。

String是二进制安全的,常用于构建文本,序列化对象,二进制数组等。

  • 图示
    请添加图片描述上图String类型实例,key为hello,value为 world
  • 命令
命令描述使用
GET获取存储在给定键中的值get name
SET设置存储在给定键中的值set name value123
DEL删除存储在给定键中的值del name
INCR将键存储的值增加1INCR key
DECR将键存储的值减少1DECR key
INCRBY将键存储的值加上整数INCRBY key amout
DECRBY将键存储的值减掉整数DECRBY key amount
  • 命令执行
127.0.0.1:6379> set hello word
OK
127.0.0.1:6379> get hello
"word"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> set counter 99
OK
127.0.0.1:6379> get counter
"99"
127.0.0.1:6379> incr counter
(integer) 100
127.0.0.1:6379> get counter
"100"
127.0.0.1:6379> incrby counter 99
(integer) 199
127.0.0.1:6379> get counter
"199"
127.0.0.1:6379> decr counter
(integer) 198
127.0.0.1:6379> get counter
"198"
  • 使用场景
    String常用在缓存,计数器,session上。
  1. 缓存:redis官方推荐的经典使用场景,将常用信息、字符串、图片等信息放到redis中,redis作为缓存层,mysql作为持久化层,可以降低mysql的读写压力。
  2. 计数器:redis作为单线程模型,一个命令执行完才会执行下一个,。
  3. session:常见Spring session + redis 实现 session 共享

List列表

Redis中的List实际上就是链表。(Redis使用双端链表实现List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。

  • 图示
    请添加图片描述
    请添加图片描述
  • 命令
命令描述使用
RPUSH将给定的值加入到链表的右端RPUSH key value
LPUSH同上,区别在加入到左端LPUSH key value
RPOP从列表的右端弹出一个值,并返回被弹出的值RPOP key
LPOP同上,左端弹出LPOP key
LRANGE获取列表在给定范围上的所有值LRANGE key 0 -1
LINDEX返回链表中索引为index的值LINDEX list 0

使用列表的技巧:

  1. lpush + lpop = Stack (栈)
  2. lpush + rpop = Queue(队列)
  3. lpush + ltrim = Capped Collection(有限集合)
  4. lpush + brpop = Messge Queue (消息队列)
  • 命令执行
127.0.0.1:6379> lpush list1 12 38 test ceshi memory
(integer) 5
127.0.0.1:6379> lrange list1 0 -1
1) "memory"
2) "ceshi"
3) "test"
4) "38"
5) "12"
127.0.0.1:6379> lindex list1 -1
"12"
127.0.0.1:6379> lindex list1 100
(nil)
127.0.0.1:6379> lpush list2 a
(integer) 1
127.0.0.1:6379> lrange list2 0 -1
1) "a"
127.0.0.1:6379> del list2
(integer) 1
127.0.0.1:6379> blpop list1 list2 0
1) "list1"
2) "memory"
  • 使用场景
  1. 微博TimeLine:有人发表微博,用lpush加入时间轴,展示新的列表信息
  2. 消息队列

Set集合

Redis的Set是String类型的无序集合。集合成员是唯一的,Set中不会出现重复的数据。

Redis中集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)

  • 图示
    请添加图片描述
    请添加图片描述
  • 命令
命令描述使用
SADD向集合添加一个或者多个成员SADD key value
SCARD获取集合的成员数SCARD key
SMEMBERS返回集合中所有成员SMEMBERS key member
SISMEMBER判断member元素是否是集合key的成员SISMEMBER key member
  • 命令执行
127.0.0.1:6379> sadd set1 halo halo1 mark halo
(integer) 3
127.0.0.1:6379> smembers set1
1) "mark"
2) "halo1"
3) "halo"
127.0.0.1:6379> sismember set1 mark
(integer) 1
  • 使用场景
  1. 标签:为用户添加标签,具有同一标签或者类似标签的可以推荐给关注同样标签的用户或者事
  2. 点赞、收藏都可以在set中实现

Hash散列

Redis Hash是一个String类型的field(字段) 和value(值)的映射表,可以视为Mapmap。

  • 图示
    请添加图片描述
    请添加图片描述
  • 命令
命令描述使用
HSET添加键值对HSET hash-key sub-key1 value1
HGET获取指定key的valueHGET hash-key key1
HGETALL获取散列中包含的所有键值对HGETALL hash-key
HDEL如果给定键存在于散列中,则移除这个键HDEL hash-key sub-key1
  • 命令执行
127.0.0.1:6379> hset userList allen stu01 mark 22 mia mia@163.com
(integer) 3
127.0.0.1:6379> hgetall userList
1) "allen"
2) "stu01"
3) "mark"
4) "22"
5) "mia"
6) "mia@163.com"
127.0.0.1:6379> hget userList user
(nil)
127.0.0.1:6379> hget userList allen
"stu01"
127.0.0.1:6379> hdel userList mark
(integer) 1
127.0.0.1:6379> hgetall userList
1) "allen"
2) "stu01"
3) "mia"
4) "mia@163.com"
  • 使用场景

缓存:相比String更节省空间,能直观的维护缓存信息,例如用户信息等


Zset有序集合

有序集合和集合一样是String类型元素的集合,并且不允许重复的成员。区别在于,每个元素都会关联一个double型的分数(score)。redis通过score将集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但是score可以重复。

有序集合主要通过两种数据结构压缩列表(ziplist)和跳跃表(zSkipList)实现

  • 图示
    请添加图片描述
    请添加图片描述
  • 命令
命令描述使用
ZADD将一个带有给定分数的成员添加到有序集合中ZADD zset-key 178 member1
ZRANGE根据元素在有序集合中所处的位置,从有序集合中获取多个元素ZRANGE zset-key 0 -1 withscores
ZREM如果给定元素成员存在于有序集合中,则移除这个元素ZREM zset-key member1
  • 命令执行
127.0.0.1:6379> zadd scoreTest 100 test1 99 test2
(integer) 2
127.0.0.1:6379> zrange scoreTest 0 -1
1) "test2"
2) "test1"
127.0.0.1:6379> zscore scoreTest test1
"100"
127.0.0.1:6379> zscore scoreTest test2
"99"
  • 使用场景
    排行榜:有序集合的经典使用场景。 例如小说视频等网站需要对用户上传的小说视频做排行榜,根据用户关注数,更新时间,点赞数等打分,作为排行依据。

HyperLogLog

  • 概述

基数统计

基数:不重复的元素

例如:arr1 = [1,2,3,4,5]; arr2 = [3,5,6,7,9],则基数为 [1,2,4,6,7,9]

Redis 2.8.9采用了 HyperLogLog,优点:占用的内存是固定的,2^64不同的元素的基数,只需要12KB的内存,0.81%的错误率。

  • 命令
命令描述使用
PFADD添加一个元素到Hyperloglog中PFADD key t1 t2
PFCOUNT统计一个元素的基数数量PFCOUNT key
PFMERGE合并N个HyperloglogPFMERGE key1 key2
  • 命令执行
127.0.0.1:6379> pfadd key1 a b c d e f g h i jk   # 创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount key1      		         # 统计元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd key2 c d jk l mn o p        # 创建第二组元素
(integer) 1
127.0.0.1:6379> pfadd key2 a e
(integer) 1
127.0.0.1:6379> pfcount key2
(integer) 9
127.0.0.1:6379> pfmerge newKey key1 key2         #合并两组元素到newKey
OK
127.0.0.1:6379> pfcount newKey
(integer) 14
  • 使用场景
    HyperLogLogs 基数统计常用来解决以下问题:
  1. 注册IP数,每日访问IP数
  2. 页面实时UV,在线用户数量
  3. 每个key最多只占用12KB,能储存2^64个值,在能容忍失误的情况下,性价比极高。

Bitmap

  • 概述
    bitmap可视为比特向量(bit vector),通过位操作,操作二进制位,进行记录。
  • 命令
命令描述使用
SETBIT通过偏移量设置bit位的值SETBIT key offset value
GETBIT查看key的offset的值GETBIT key offset
BITCOUNT统计key的valueBITCOUNT key start end

key即为String,String拆分为一位一位(offset),进行值value的设置。

  • 命令执行
# 假设bitmap记录这几天的打卡情况
127.0.0.1:6379> setbit test 0 1  # 第一天的打卡情况: 1
(integer) 0
127.0.0.1:6379> setbit test 1 1
(integer) 0
127.0.0.1:6379> setbit test 2 0  # 第三天的打卡情况:0
(integer) 0
127.0.0.1:6379> setbit test 3 1
(integer) 0
127.0.0.1:6379> setbit test 4 0
(integer) 0
127.0.0.1:6379> setbit test 5 0
(integer) 0
127.0.0.1:6379> getbit test 3    # 查看第四天的打卡情况
(integer) 1
127.0.0.1:6379> getbit test 5
(integer) 0
127.0.0.1:6379> bitcount test    # 查看这几天总共有几天打卡
(integer) 3
  • 使用场景

常用于统计用户是否打卡,是否活跃。并且内存占用较小,例如:存储一年的打卡状态需要365bit,1Byte = 8bit,则只需要约46个字节。


Geospatial

  • 概述
    Redis3.2提出该数据结构,能够存储地理坐标,并且进行搜索,推算两地之间的距离。
  • 命令
命令描述使用
geoadd添加地理位置geoadd key 经度 纬度 地名
geopos获取指定地名的经纬度geopos key 地名
geodist返回两地的距离,如果不存在,则返回空;单位:m,km,mi(英里),ft(英尺)geodist key 地名1 地名2
georadius通过半径获取所有在key中的地点;参数 key 经度 纬度 半径 单位 [显示结果的经度和纬度] [显示结果的距离] [显示的结果的数量]georadius key 经度 纬度 半径 单位
georadiusbymember显示与指定地名一定半径范围内的其他地名georadiusbymember key 地名 半径 单位
geohash返回哈希字符串geohash key 地名
  • 命令执行
# 添加操作
127.0.0.1:6379> geoadd china:city 112.24 23.42 beijing 139.22 29.55 chongqing
(integer) 2
127.0.0.1:6379> geoadd china:city 114.33 23.11 shenzhen
(integer) 1
# 获取指定地名的经纬度
127.0.0.1:6379> geopos china:city chongqing
1) 1) "139.22000259160995483"
   2) "29.55000106367493373"
# 返回两地的距离,如果不存在,则返回空   
127.0.0.1:6379> geodist china:city chongqing beijing m
"2764085.0748"
127.0.0.1:6379> geodist china:city chongqing xiamen km
(nil)
# 以110,23这个坐标作为中心,寻找半径为500km的城市
127.0.0.1:6379> georadius china:city 110 23 500 km 
1) "beijing"
2) "shenzhen"
# 以 chongqing 为中心,寻找半径为1000km的城市
127.0.0.1:6379> georadiusbymember china:city chongqing 1000 km
1) "chongqing"
127.0.0.1:6379> georadiusbymember china:city shenzhen 1000 km
1) "shenzhen"
2) "beijing"
# 获取chongqing shenzhen 的hash
127.0.0.1:6379> geohash china:city chongqing shenzhen
1) "xj70052vjp0"
2) "ws173xh9d00"
  • 使用场景
    需要使用地理位置的场景

参考文章:
https://www.cnblogs.com/junlinsky/p/13528452.html

https://www.cnblogs.com/touyel/p/12728096.html

https://www.cnblogs.com/junlinsky/p/13528452.html

https://www.cnblogs.com/wang-sky/p/13857787.html


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值