Redis的数据结构string、hash、list、set、zset、HyperLogLog

目录

一:Redis的数据类型 - string(字符串)

二:Redis的数据类型 - hash(哈希结构)

​​​​​​​三:Redis的数据类型 - list(列表)

​​​​​​​​​​​​​​四:Redis的数据类型 - set(无序集合)

​​​​​​​​​​​​​​五:Redis的数据类型 - zset(有序集合)

​​​​​​​​​​​​​​六:Redis的数据类型 - HyperLogLog(基数)


Redis命令文档参考:Redis 命令参考 — Redis 命令参考

Redis的6种数据类型:http://c.biancheng.net/view/4510.html

https://www.cnblogs.com/haoprogrammer/p/11065461.html

一:redis数据类型-string(字符串)
1、string 字符串
string: 最简单的字符串类型键值对缓存,也是最基本的。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

常用命令:set、get、decr、incr、mget等。

注意:一个键最大能存储512MB。

2、key相关
keys *:查看所有的key (不建议在生产上使用,有性能影响)
type key:key的类型

3、string类型

get/set/del:查询/设置/删除
set rekey data:设置已经存在的key,会覆盖
setnx rekey data:设置已经存在的key,不会覆盖
set key value ex time:设置带过期时间的数据
expire key:设置过期时间
ttl:查看剩余时间,-1永不过期,-2过期

append key:合并(拼接)字符串
strlen key:字符串长度

incr key:累加1
decr key:类减1
incrby key num:累加给定数值
decrby key num:累减给定数值

getrange key start end:截取数据,end=-1 代表到最后
setrange key start newdata:从start位置开始替换数据

mset:连续设值
mget:连续取值
msetnx:连续设置,如果存在则不设置

4、其他

select index:切换数据库,总共默认16个,默认使用库0
key *:查询某个库下存在的所有的key
flushdb:删除当前下边db中的数据
flushall:删除所有db中的数据

5、使用场景

i. 缓存

ii. 计数:点赞,视频播放量,每播放一次就+1

iii. 接口防刷:验证码登录,公司一般的验证码等发短信功能都是调用的第三方接口,如果被有心之人利用了,会给公司造成一定的损失,所以简单的解决方法就是限流

二:redis数据类型-hash(哈希结构)

1、redis的hash命令简述
hash:类似map,存储结构化数据结构,比如存储一个对象(不能有嵌套对象)。

Redis hash 是一个键值(key=>value)对集合;是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

每个 hash 可以存储 232 -1 键值对(40多亿)。

常用命令:hget、hset、hgetall等。

2、hash的使用
 

hset key property value:
# 创建一个user对象,这个对象中包含name属性,name值为imooc
hset user name imooc
hget user name:获取用户对象中name的值

#hmset:设置对象中的多个键值对
hmset user age 18 phone 139123123
#hmsetnx:设置对象中的多个键值对,存在则不添加
hmsetnx user age 18 phone 139123123

hmget user age phone:hmget获取对象中的多个属性

hgetall user:获取user对象下的所有属性。

hlen user:获取user对象里面的属性。
hexists user age:判断属性是否存在,有该属性则返回该属性的数量。
hkeys user:返回所有的属性key
hvals user:返回所有user对象的value属性。

hincrby user age 3  user:累加对象的age属性。
hincrbyfloat user age 2.2:累加对象的age属性-小数

hexists user email 没有该属性返回该属性的数量为 0。

clear:清空。
hdel 对象  对象属性  
hgetall 对象 返回该对象的属性
hdel user:删除对象

3、使用场景

应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。

i. 存储用户信息

§ 原生string:直观,占用键多

§ 序列化字符串:序列化后好操作,每次都需要反序列化和序列化所有字段

§ 哈希类型:简单直观,减少内存空间的使用

三:Redis的数据类型 - list(列表)

1、list

list:是一个列表相当于一个数组,[a, b, c, d, …]。

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。

常用命令:lpush、rpush、lpop、rpop、lrange等。

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

2、使用【a b c d e】为列表的值

lpush list1 a b c d e:构建一个list,从左边开始存入数据,lpush=left push

rpush list2 a b c d e:构建一个list,从右边开始存入数据,rpush=right push

lrange list1 0 -1:获得数据[0=start,-1=end]



lpop list1:从左侧开始拿出一个数据,取出后list1里面就没有1了

rpop list2:从右侧开始拿出一个数据,取出后list1里面就没有5了



llen list1:list长度

lindex list1 index:获取list下标的值

lset list1 index value:把某个下标的值替换



linsert list1 before/after value:插入一个新的值

lrem list1 2 a:删除几(2)个(a)相同数据,lrem list1 num value

ltrim list1 0 -1:截取值,替换原来的list,ltrim list1 start end



del list1:删除列表

3、使用场景

消息队列:Redis的lpush+brpop命令组合即可实现阻塞队列【不建议使用,毕竟专业的事情交给专业的组件去完成,如消息中间件】

四:redis数据类型-set(无序集合)

1、Redis的Set无序集合介绍

Redis的Set是string类型的无序集合。和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。

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

常用命令:sadd、spop、smembers、sunion等。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

2、set集合命令
 

# 自动去除重复数据
sadd set duck pig cow sheep sheep sheep pig
# 列出所有数据
SMEMBERS set

# 查看当前set有多少个数量
scard set
# 判断某个值是否包含在里面,1=true,0=false
sismember set pig

#删除set里面某一项
srem set duck
# 删除随机的项 或者 指定删除2项
spop set  或者 spop set 2
#构建set1
sadd set1 1 2 3 4 5 6 7 8 9 10
smembers set1
#随机获取里面的内容
srandmember set1 2
#构建set2
sadd set2 3 5 7 11 12 13 14 15

#将10从set1移出到set2,set1里面没有10了
smove set1 set2 10

**set 可以做差集 交集和并集,set1和set2里面有些值是相同的
#差集(不包含的值),那个在前面就把那个的不包含的值拿出来
sdiff set1 set2
#交集(就是把两者相同的值拿出来)
sinter set1 set2
#并集(将两者的值合并拿出来)
sunion set1 set2

#删除
del set1

3、使用场景

** 利用交集求共同好友。

** 利用唯一性,可以统计访问网站的所有独立IP。

**  好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

五:redis数据类型-zset(有序集合)
1、sorted set
Sorted set:排序的set,可以去重可以排序,比如可以根据用户积分做排名,积分作为set的一个数值,根据数值可以做排序。Set中的每一个member都带有一个分数。

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

sorted set是插入有序的,即自动排序。

常用命令:zadd、zrange、zrem、zcard等。

当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。


2、zset使用

# 设置member和对应的分数,zadd zset 10 value1 20 value2 ..
zadd zset 10 duck 20 pig 30 chicken 40 beef 50 sheep
#查看所有zset中的内容
zrange zset 0 -1
#带有分数
zrange zset 0 -1 withscores

#获取对应的下标
zrank zset pig
#获取对应的分数
zscore zset pig

#统计个数
zcard zset
#统计个数,zcount zset 分数1 分数2(必须是两个参数)
zcount zset 20 30

#查询分数之间的member(包含分数1 分数2)
zrangebyscore zset 10 30
#查询分数之间的member(不包含包含分数1和分数2)
zrangebyscore zset (10 (20
#查询分数之间的member(包含包含分数1和分数2),获得的结果集再次根据下标区间做查询
zrangebyscore zset 10 30 limit start end

#删除member,zrem zset value
zrem zset beef sheep

3、使用场景

(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。

(2)排行榜应用,根据得分列出topN的用户等。

Sorted set:排序的set,可以去重可以排序,比如可以根据用户积分做排名,积分作为set的一个数值,根据数值可以做排序。Set中的每一个member都带有一个分数。

六:redis数据类型-HyperLogLog(基数)

1、HyperLogLog基数

基数是一种算法。举个例子,一本英文著作由数百万个单词组成,你的内存却不足以存储它们,那么我们先分析一下业务。

英文单词本身是有限的,在这本书的几百万个单词中有许许多多重复单词,扣去重复的单词,这本书中也就是几千到一万多个单词而已,那么内存就足够存储它们了。

比如数字集合 {1,2,5,7,9,1,5,9} 的基数集合为 {1,2,5,7,9} 那么基数(不重复元素)就是 5,基数的作用是评估大约需要准备多少个存储单元去存储数据,但是基数的算法一般会存在一定的误差(一般是可控的)。Redis 对基数数据结构的支持是从版本 2.8.9 开始的。

基数并不是存储元素,存储元素消耗内存空间比较大,而是给某一个有重复元素的数据集合(一般是很大的数据集合)评估需要的空间单元数,所以它没有办法进行存储,加上在工作中用得不多,所以简要介绍一下 Redis 的 HyperLogLog 命令就可以了,如表 1 所示。
 

你可能感兴趣的:(Redis,Redis基础数据类型)