Redis的数据类型(redis的数据类型,以及每种数据类型的使用场景)
mhr18 2024-10-29 14:32 23 浏览 0 评论
redis当中一共支持五种数据类型,分别是:
- string字符串
- list列表
- set集合
- hash表
- zset有序集合
通过这五种不同的数据类型,可以实现各种不同的功能,也可以应用在各种不同的场景。
Redis当中各种数据类型结构如上图:
对字符串string的操作
下表列出了常用的 redis 字符串命令
序号 | 命令及描述 | 示例 |
1 | SET key value | 示例:SET hello world |
2 | GET key | 示例:GET hello |
4 | GETSET key value | 示例:GETSET hello world2 |
5 | MGET key1 [key2..] | 示例:MGET hello world |
6 | SETEX key seconds value | 示例:SETEX hello 10 world3 |
7 | SETNX key value | 示例:SETNX key redisvalue |
9 | STRLEN key | 示例:STRLEN key |
10 | MSET key value [key value ...] | 示例:MSET key2 keyvalue2 key3 keyvalue3 |
12 | MSETNX key value [key value ...] | 示例:MSETNX key4 keyvalue4 key5 keyvalue5 |
13 | PSETEX key milliseconds value | 示例:PSETEX key6 6000 key6value |
14 | INCR key | 示例: set key7 1 INCR key7 GET key7 |
15 | INCRBY key increment | 示例:INCRBY key7 2 get key7 |
16 | INCRBYFLOAT key increment | 示例:INCRBYFLOAT key7 0.8 |
17 | DECR key | 示例: set key8 1 DECR key8 GET key8 |
18 | DECRBY key decrement | 示例:DECRBY key8 3 |
19 | APPEND key value | 示例:APPEND key8 hello |
对hash列表的操作
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
下表列出了 redis hash 基本的相关命令:
序号 | 命令及描述 | 示例 |
1 | HSET key field value | 示例:HSET key1 field1 value1 |
2 | HSETNX key field value | 示例:HSETNX key1 field2 value2 |
3 | HMSET key field1 value1 [field2 value2 ] | 示例:HMSET key1 field3 value3 field4 value4 |
4 | HEXISTS key field | 示例: HEXISTS key1 field4 HEXISTS key1 field6 |
5 | HGET key field | 示例:HGET key1 field4 |
6 | HGETALL key | 示例:HGETALL key1 |
7 | HKEYS key | 示例:HKEYS key1 |
8 | HLEN key | 示例:HLEN key1 |
9 | HMGET key field1 [field2] | 示例:HMGET key1 field3 field4 |
10 | HINCRBY key field increment | 示例: HSET key2 field1 1 HINCRBY key2 field1 1 HGET key2 field1 |
11 | HINCRBYFLOAT key field increment | 示例:HINCRBYFLOAT key2 field1 0.8 |
12 | HVALS key | 示例:HVALS key1 |
13 | HDEL key field1 [field2] | 示例: HDEL key1 field3 HVALS key1 |
对list列表的操作
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
下表列出了列表相关的基本命令:
序号 | 命令及描述 | 示例 |
1 | LPUSH key value1 [value2] | 示例:LPUSH list1 value1 value2 |
2 | LRANGE key start stop 查看list当中所有的数据 | 示例:LRANGE list1 0 -1 |
3 | LPUSHX key value | 示例:LPUSHX list1 value3 LINDEX list1 0 |
4 | RPUSH key value1 [value2] | 示例: RPUSH list1 value4 value5 LRANGE list1 0 -1 |
5 | RPUSHX key value | 示例:RPUSHX list1 value6 |
6 | LINSERT key BEFORE|AFTER pivot value | 示例:LINSERT list1 BEFORE value3 beforevalue3 |
7 | LINDEX key index | 示例:LINDEX list1 0 |
8 | LSET key index value | 示例:LSET list1 0 hello |
9 | LLEN key | 示例:LLEN list1 |
10 | LPOP key | 示例:LPOP list1 |
11 | RPOP key | 示例:RPOP list1 |
12 | BLPOP key1 [key2 ] timeout | 示例:BLPOP list1 2000 |
13 | BRPOP key1 [key2 ] timeout | 示例:BRPOP list1 2000 |
14 | RPOPLPUSH source destination | 示例:RPOPLPUSH list1 list2 |
15 | BRPOPLPUSH source destination timeout | 示例:BRPOPLPUSH list1 list2 2000 |
16 | LTRIM key start stop | 示例:LTRIM list1 0 2 |
17 | DEL key1 key2 删除指定key的列表 | 示例:DEL list2 |
对set集合的操作
- Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
下表列出了 Redis 集合基本命令:
序号 | 命令及描述 | 示例 |
1 | SADD key member1 [member2] | 示例:SADD set1 setvalue1 setvalue2 |
2 | SMEMBERS key | 示例:SMEMBERS set1 |
3 | SCARD key | 示例:SCARD set1 |
4 | SDIFF key1 [key2] | 示例: SADD set2 setvalue2 setvalue3 SDIFF set1 set2 |
5 | SDIFFSTORE destination key1 [key2] | 示例:SDIFFSTORE set3 set1 set2 |
6 | SINTER key1 [key2] | 示例:SINTER set1 set2 |
7 | SINTERSTORE destination key1 [key2] | 示例:SINTERSTORE set4 set1 set2 |
8 | SISMEMBER key member | 示例:SISMEMBER set1 setvalue1 |
9 | SMOVE source destination member | 示例:SMOVE set1 set2 setvalue1 |
10 | SPOP key | 示例:SPOP set2 |
11 | SRANDMEMBER key [count] | 示例:SRANDMEMBER set2 2 |
12 | SREM key member1 [member2] | 示例:SREM set2 setvalue1 |
13 | SUNION key1 [key2] | 示例:SUNION set1 set2 |
14 | SUNIONSTORE destination key1 [key2] | 示例:SUNIONSTORE set5 set1 set2 |
对key的操作
下表给出了与 Redis 键相关的基本命令:
序号 | 命令及描述 | 示例 |
1 | DEL key | 示例:del key5 |
2 | DUMP key | 示例:DUMP key1 |
3 | EXISTS key | 示例:exists key |
4 | EXPIRE key seconds | 示例:expire key 5 |
6 | PEXPIRE key milliseconds | 示例:PEXPIRE set3 3000 |
8 | KEYS pattern | 示例:keys * |
10 | PERSIST key | 示例:persist set2 |
11 | PTTL key | 示例:pttl set2 |
12 | TTL key | 示例:ttl set2 |
13 | RANDOMKEY | 示例: randomkey |
14 | RENAME key newkey | 示例:rename set5 set8 |
15 | RENAMENX key newkey | 示例:renamenx set8 set10 |
16 | TYPE key | 示例:type set10 |
对ZSet的操作
- Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
- 它用来保存需要排序的数据,例如排行榜,一个班的语文成绩,一个公司的员工工资,一个论坛的帖子等。
- 有序集合中,每个元素都带有score(权重),以此来对元素进行排序
- 它有三个元素:key、member和score。以语文成绩为例,key是考试名称(期中考试、期末考试等),member是学生名字,score是成绩。
# | 命令及描述 | 示例 |
1 | ZADD key score1 member1 [score2 member2] | 向ZSet中添加页面的PV值 ZADD pv_zset 120 page1.html 100 page2.html 140 page3.html |
2 | ZCARD key | 获取所有的统计PV页面数量 ZCARD pv_zset |
3 | ZCOUNT key min max | 获取PV在120-140在之间的页面数量 ZCOUNT pv_zset 120 140 |
4 | ZINCRBY key increment member | 给page1.html的PV值+1 ZINCRBY pv_zset 1 page1.html |
5 | ZINTERSTORE destination numkeys key [key ...] | 创建两个保存PV的ZSET: ZADD pv_zset1 10 page1.html 20 page2.html ZADD pv_zset2 5 page1.html 10 page2.html ZINTERSTORE pv_zset_result 2 pv_zset1 pv_zset2 |
7 | ZRANGE key start stop [WITHSCORES] | 获取所有的元素,并可以返回每个key对一个的score ZRANGE pv_zset_result 0 -1 WITHSCORES |
9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 获取ZSET中120-140之间的所有元素 ZRANGEBYSCORE pv_zset 120 140 |
10 | ZRANK key member | 获取page1.html的pv排名(升序) ZRANK pv_zset page3.html |
11 | ZREM key member [member ...] | 移除page1.html ZREM pv_zset page1.html |
15 | ZREVRANGE key start stop [WITHSCORES] | 按照PV降序获取页面 ZREVRANGE pv_zset 0 -1 |
17 | ZREVRANK key member | 获取page2.html的pv排名(降序) ZREVRANK pv_zset page2.html |
18 | ZSCORE key member | 获取page3.html的分数值 ZSCORE pv_zset page3.html |
对位图BitMaps的操作
- 计算机最小的存储单位是位bit,Bitmaps是针对位的操作的,相较于String、Hash、Set等存储方式更加节省空间
- Bitmaps不是一种数据结构,操作是基于String结构的,一个String最大可以存储512M,那么一个Bitmaps则可以设置2^32个位
- Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量
- BitMaps 命令说明:将每个独立用户是否访问过网站存放在Bitmaps中, 将访问的用户记做1, 没有访问的用户记做0, 用偏移量作为用户的id 。
设置值
SETBIT key offset value |
setbit命令设置的vlaue只能是0或1两个值
- 设置键的第offset个位的值(从0算起),假设现在有20个用户,uid=0,5,11,15,19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图所示
- 具体操作过程如下, unique:users:2016-04-05代表2016-04-05这天的独立访问用户的Bitmaps
setbit unique:users:2016-04-05 0 1 setbit unique:users:2016-04-05 5 1 setbit unique:users:2016-04-05 11 1 setbit unique:users:2016-04-05 15 1 setbit unique:users:2016-04-05 19 1 |
- 很多应用的用户id以一个指定数字(例如10000) 开头, 直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费, 通常的做法是每次做setbit操作时将用户id减去这个指定数字。
- 在第一次初始化Bitmaps时, 假如偏移量非常大, 那么整个初始化过程执行会比较慢, 可能会造成Redis的阻塞。
获取值
GETBIT key offset |
- 获取键的第offset位的值(从0开始算),例:下面操作获取id=8的用户是否在2016-04-05这天访问过, 返回0说明没有访问过
getbit unique:users:2016-04-05 8 |
获取Bitmaps指定范围值为1的个数
BITCOUNT key [start end] |
例:下面操作计算2016-04-05这天的独立访问用户数量:
bitcount unique:users:2016-04-05 |
Bitmaps间的运算
BITOP operation destkey key [key, …] |
- bitop是一个复合操作, 它可以做多个Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在destkey中。 假设2016-04-04访问网站的userid=1, 2, 5, 9, 如图3-13所示:
setbit unique:users:2016-04-04 1 1 setbit unique:users:2016-04-04 2 1 setbit unique:users:2016-04-04 5 1 setbit unique:users:2016-04-04 9 1 |
例1:下面操作计算出2016-04-04和2016-04-05两天都访问过网站的用户数量, 如下所示。
bitop and unique:users:and:2016-04-04_05 unique:users:2016-04-04 unique:users:2016-04-05 bitcount unique:users:2016-04-04_05 |
例2:如果想算出2016-04-04和2016-04-03任意一天都访问过网站的用户数量(例如月活跃就是类似这种) , 可以使用or求并集, 具体命令如下:
bitop or unique:users:or:2016-04-04_05 unique:users:2016-04-04 unique:users:2016-04-05 bitcount unique:users:or:2016-04-04_05 |
对HyperLogLog结构的操作
应用场景
HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计。
要统计一个页面的访问量(PV),可以直接用redis计数器或者直接存数据库都可以实现,如果要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样,我们可以使用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应的userid,这种方法是可行的。但如果访问量较多,假如有几千万的访问量,这就麻烦了。为了统计访问量,要频繁创建SET集合对象。 |
Redis实现HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet(菲利普·弗拉若莱)教授。Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
UV计算示例
node1.key.cn:6379> help @hyperloglog PFADD key element [element ...] summary: Adds the specified elements to the specified HyperLogLog. since: 2.8.9 PFCOUNT key [key ...] summary: Return the approximated cardinality(基数) of the set(s) observed by the HyperLogLog at key(s). since: 2.8.9 PFMERGE destkey sourcekey [sourcekey ...] summary: Merge N different HyperLogLogs into a single one. since: 2.8.9 |
Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据,一个是来统计的。为什么用pf?是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ,所以用发明人的英文缩写,这样容易记住这个语法了。
下面我们通过一个示例,来演示如何计算uv。
node1.key.cn:6379> pfadd uv user1 (integer) 1 node1.key.cn:6379> keys * 1) "uv" node1.key.cn:6379> pfcount uv (integer) 1 node1.key.cn:6379> pfadd uv user2 (integer) 1 node1.key.cn:6379> pfcount uv (integer) 2 node1.key.cn:6379> pfadd uv user3 (integer) 1 node1.key.cn:6379> pfcount uv (integer) 3 node1.key.cn:6379> pfadd uv user4 (integer) 1 node1.key.cn:6379> pfcount uv (integer) 4 node1.key.cn:6379> pfadd uv user5 user6 user7 user8 user9 user10 (integer) 1 node1.key.cn:6379> pfcount uv (integer) 10 |
HyperLogLog算法一开始就是为了大数据量的统计而发明的,所以很适合那种数据量很大,然后又没要求不能有一点误差的计算,HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,不过这对于页面用户访问量是没影响的,因为这种统计可能是访问量非常巨大,但是又没必要做到绝对准确,访问量对准确率要求没那么高,但是性能存储方面要求就比较高了,而HyperLogLog正好符合这种要求,不会占用太多存储空间,同时性能不错
pfadd和pfcount常用于统计,需求:假如两个页面很相近,现在想统计这两个页面的用户访问量呢?这里就可以用pfmerge合并统计了,语法如例子:
node1.key.cn:6379> pfadd page1 user1 user2 user3 user4 user5 (integer) 1 node1.key.cn:6379> pfadd page2 user1 user2 user3 user6 user7 (integer) 1 node1.key.cn:6379> pfmerge page1+page2 page1 page2 OK node1.key.cn:6379> pfcount page1+page2 (integer) 7 |
HyperLogLog为什么适合做大量数据的统计
- Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
- 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
- 但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如:数据集{1, 3, 5, 7, 5, 7, 8},那么这个数据集的基数集{1, 3, 5, 7, 8},基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。
相关推荐
- 【预警通报】关于WebLogic存在远程代码执行高危漏洞的预警通报
-
近日,Oracle官方发布了2021年1月关键补丁更新公告CPU(CriticalPatchUpdate),共修复了包括CVE-2021-2109(WeblogicServer远程代码执行漏洞)...
- 医院信息系统突发应急演练记录(医院信息化应急演练)
-
信息系统突发事件应急预案演练记录演练内容信息系统突发事件应急预案演练参与人员信息科参与科室:全院各部门日期xxxx-xx-xx时间20:00至24:00地点信息科记录:xxx1、...
- 一文掌握怎么利用Shell+Python实现完美版的多数据源备份程序
-
简介:在当今数字化时代,无论是企业还是个人,数据的安全性和业务的连续性都是至关重要的。数据一旦丢失,可能会造成无法估量的损失。因此,如何有效地对分布在不同位置的数据进行备份,尤其是异地备份,成为了一个...
- docker搭建系统环境(docker搭建centos)
-
Docker安装(CentOS7)1.卸载旧版Docker#检查已安装版本yumlistinstalled|grepdocker#卸载旧版本yumremove-ydocker.x...
- 基础篇:数据库 SQL 入门教程(sql数据库入门书籍推荐)
-
SQL介绍什么是SQLSQL指结构化查询语言,是用于访问和处理数据库的标准的计算机语言。它使我们有能力访问数据库,可与多种数据库程序协同工作,如MSAccess、DB2、Informix、M...
- Java21杀手级新特性!3行代码性能翻倍
-
导语某券商系统用这招,交易延迟从12ms降到0.8ms!本文揭秘Oracle官方未公开的Record模式匹配+虚拟线程深度优化+向量API神操作,代码量直降70%!一、Record模式匹配(代码量↓8...
- 一文读懂JDK21的虚拟线程(java虚拟线程)
-
概述JDK21已于2023年9月19日发布,作为Oracle标准Java实现的一个LTS版本发布,发布了15想新特性,其中虚拟线程呼声较高。虚拟线程是JDK21中引入的一项重要特性,它是一种轻量级的...
- 效率!MacOS下超级好用的Linux虚拟工具:Lima
-
对于MacOS用户来说,搭建Linux虚拟环境一直是件让人头疼的事。无论是VirtualBox还是商业的VMware,都显得过于笨重且配置复杂。今天,我们要介绍一个轻巧方便的纯命令行Linux虚拟工具...
- 所谓SaaS(所谓三维目标一般都应包括)
-
2010年前后,一个科技媒体的主编写一些关于云计算的概念性问题,就可以作为头版头条了。那时候的云计算,更多的还停留在一些概念性的问题上。而基于云计算而生的SaaS更是“养在深闺人未识”,一度成为被IT...
- ORA-00600 「25027」 「x」报错(报错0xc0000001)
-
问题现象:在用到LOB大对象的业务中,进行数据的插入,失败了,在报警文件中报错:ORA-00600:内部错误代码,参数:[25027],[10],[0],[],[],[],[],[...
- 安卓7源码编译(安卓源码编译环境lunch失败,uname命令找不到)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 编译安卓源码(编译安卓源码 电脑配置)
-
前面已经下载好源码了,接下来是下载手机对应的二进制驱动执行编译源码命令下载厂商驱动https://developers.google.com/android/drivers?hl=zh-cn搜索NGI...
- 360 Vulcan Team首战告捷 以17.5万美金强势领跑2019“天府杯“
-
2019年11月16日,由360集团、百度、腾讯、阿里巴巴、清华大学与中科院等多家企业和研究机构在成都联合主办了2019“天府杯”国际网络安全大赛暨2019天府国际网络安全高峰论坛。而开幕当日最激荡人...
- Syslog 日志分析与异常检测技巧(syslog发送日志配置)
-
系统日志包含有助于分析网络设备整体运行状况的重要信息。然而,理解并从中提取有效数据往往颇具挑战。本文将详解从基础命令行工具到专业日志管理软件的全流程分析技巧,助你高效挖掘Syslog日志价值。Gr...
- 从Oracle演进看数据库技术的发展(从oracle演进看数据库技术的发展的过程)
-
数据库技术发展本质上是应用需求驱动与基础架构演进的双向奔赴,如何分析其技术发展的脉络和方向?考虑到oracle数据库仍然是这个领域的王者,以其为例,管中窥豹,对其从Oracle8i到23ai版本的核...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)