Redis笔记(三)Redis的数据类型
前面说过,Redis的一大特性是支持丰富的数据类型,
这为更多的应用场景提供了可能。
Redis有五种数据类型,包括string,list,set,sorted set和hash,
注意,Redis的数据类型不支持嵌套。
下面学习一下这五种数据类型的特点和简单应用。
1.String 字符串
String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。
应用场景:
应用最广泛,Redis最基础的数据类型。
常用命令:
set,get,将字符串值value关联到key/返回key所关联的字符串值。
incr,将key中储存的数字值增一。
decr,将key中储存的数字值减一。
mset,同时设置一个或多个key-value对。
mget,返回所有(一个或多个)给定key的值。
2.Hash 哈希
很多时候我们需要存储一些对象数据信息,
比如用户信息,包括用户的昵称、年龄、性别等,如果使用String数据类型,
通常是将这些信息序列化后存储为一个JSON 格式的字符串,比如“lilei,18,man”。
如果更新这些信息,需要将字符串(JSON)取出来,进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。在数据的传输和处理时会造成很大的浪费,
这个时候散列数据类型就可以很好解决这个问题。Hash 结构可以直接修改某一项属性值。
实现方式:
常用命令:
HSET 给字段赋值,更新时可以直接覆盖
HGET 获得字段的值
HMSET,HMGET 给多个字段赋值(获得值)
HGETALL 获取键中所有字段和字段值
如,
redis> hmset tom age 18 gender male
OK
redis> hgetall tom
1) "age"
2) "18"
3) "gender"
4) "male"
3.List 列表
应用场景:
关注列表,粉丝列表,消息队列等。
实现方式:
list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
常用命令:
#将一个或多个值value插入到列表key的表头/移除并返回列表key的头元素
lpush,lpop
#将一个或多个值value插入到列表key的表尾(最右边)/移除并返回列表key的尾元素
rpush,rpop
#返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
lrange
# LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
BLPOP(阻塞版)
4.Set 集合
由一个或多个元素所构成的叫做集合。
集合中的元素有三个特征:确定性,互异性,无序性。集合和列表的区别在于列表中的元素有序且并不一定唯一。Redis还为集合提供了求交集、并集、差集等操作。
应用场景:
set对外提供的功能与list类似,但是set可以自动排重,当你需要存储一个列表数据,又不希望出现重复数据时,set是很好的选择。
set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
实现方式:
set 的内部实现是一个value为null的HashMap, 实际就是通过计算hash的方式来快速排重的,操作set的时间复杂度始终为O(1)。
常用命令:
#向集合中添加一个或多个元素,返回成功加入的元素
SADD key member1 [member2...]
#删除一个或多个元素
SREM key member [member...]
#随机弹出一个元素
SPOP key
#集合间运算,差集运算
SDIFF key [key...]
#交集运算
SINTER key [key...]
#并集运算
SUNION key [key...]
#获得集合中的所有元素
SMEMBERS key
#判断元素是否在集合中
SISMEMBERS key member
操作实例:
redis>sadd myset a b c
(integer) 3
redis>smembers myset
1) "a"
2) "c"
3) "b"
redis>spop myset
"a"
5.Sorted set 有序集合
有序集合在集合类型的基础上,为每个元素都关联了一个分数,这样除了可以进行集合相关的操作,
还可以根据分数不同,进行排序等操作,有序集合中元素的分数可以是相同的。
应用场景:
以某个条件为权重,比如按顶的次数排序。
可以用Sorted Sets来做带权重的队列,
比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
实现方式:
Redis sorted set的内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的分数。
有序集合和列表的区别:
list和sorted set中元素都是有序的,
列表类型是听过链表实现的,当元素增多时,访问中间元素速度会下降,
而有序集合是用HashMap和跳跃表(SkipList),不存在这个问题,但是有序集合的内存开销比列表要大。
常用命令:
#添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
ZADD key score1 member1 [score2 member2]
#由索引返回一个成员范围的有序集合
ZRANGE key start stop [WITHSCORES]
#移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
ZREM
#返回有序集 key 的基数。
ZCARD
Redis笔记(三)Redis的数据类型的更多相关文章
- redis相关笔记(三.redis设计与实现(笔记))
redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- Redis笔记1-Redis介绍及数据类型使用场景
Redis介绍:C语言开发.单线程操作.高性能.键值对.可持久化的数据库.Redis采用redisObject结构来统一五种数据类型,redisObject是五种类型的父类,可以在函数间传递时隐藏具体 ...
- redis学习笔记(三)——redis的命令大全总结
总结了一些redis五种存储类型的常用命令以及一些通用操作命令,不是很全,是在学习的时候将学到的做了个汇总,使用的时候可以查一下. 笔记写在表格里面了,不好粘贴.......后面的直接截图了..... ...
- redis笔记(三)
redis配置文件 配置文件对单位大小写不敏感 tcp-backlog 511 高并发环境连接数 tcp-keepalive 单位为秒 0 表示不会进行keepalive检测,,,建议设置 ...
- Redis 笔记(一)——数据类型简介
Redis 是一个 key-value 存储系统,但是它的 value 值不仅仅可以存储字符串,value 共有 五种 数据结构类型,具体如下: 数据结构类型 结构类型 结构存储的值 结构的读写能力 ...
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- redis学习三 redis持久化
1,快照持久化 1简介 redis可以通过创建快照来获得某个时间点上的内存内容的数据副本,有了副本之后,就可以将副本发送到其他redis服务器上从而创建相同数据的从服务器,同时快照留在原 ...
- redis教程(三)-----redis缓存雪崩、缓存穿透、缓存预热
缓存雪崩 概念 缓存雪崩是由于原有缓存失效(过期),新缓存未到期间.所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 解决 ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
随机推荐
- ubuntu14.04配置中文latex完美环境(texlive+texmaker+lyx)
Ubuntu下的文档编辑虽然有libreoffice,但对中文和公式的排版始终不如ms office,因此要想写出高质量的文档,只能靠latex了,现在随着xeCjk的开发,中文文档在ubuntu下的 ...
- 位图索引:原理(BitMap index)
http://www.cnblogs.com/LBSer/p/3322630.html 位图(BitMap)索引 前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这 ...
- Visual Studio IIS Express 不支持.json后缀的mime类型
vs默认web调试工具中并不支持.json后缀的mime类型. 如何解决,两个方案: 局部单应用:web.config: <system.webServer> .... <stati ...
- ExecutorService的十个使用技巧
ExecutorService] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent /ExecutorService.ht ...
- Change ICON of MFC Application and Dialog
Change ICON of MFC Application and Dialoghttp://www.codeproject.com/Tips/406870/Change-ICON-of-MFC-A ...
- css的一些小技巧!页面视觉差!
相当长的一段时间,现在网站与所谓的“视差”效果一直很受欢迎. 万一你没有听说过这种效果,不同的图像,在不同的方向移动或层主要包括.这导致了一个很好的光学效应,使参观者的注意. 在网页设计中,为了实现这 ...
- kindle paperwhite折腾记
在亚马逊官网上买了一个kindle paperwhite 一代(849元) , 打算再买个皮套, 淘宝店 http://detail.tmall.com/item.htm?spm=a230r.1.1 ...
- 网站程序版本号信息也可能造成bd快照严重滞后
在a5上看到一篇“破解阿里云论坛的快照时间迷局 或涉足所有phpwind论坛”的文章,里面说到pw的一个版本信息导致了快照滞后的问题,这再次验证了之前那篇文章“时间戳造成快照滞后”的准确性. 如下图所 ...
- [Effective JavaScript笔记]第3条:当心隐式的强制转换
js对类型错误出奇的宽容 3+true; //4 3*””; //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...
- AspectJ报错:error at ::0 can't find referenced pointcut XXX
今天在使用AspectJ进行注解切面时,遇到了一个错误. 切点表达式就是无法识别——详细报错信息如下: Exception in thread "main" org.springf ...