redis基础02-redis的5种对象数据类型
表格引用地址:http://www.cnblogs.com/xrq730/p/8944539.html
参考书籍:《Redis设计与实现》,《Redis运维与开发》
1.对象
Redis基于基础的数据结构创建了五种不同类型的对象系统,分别是:
字符串对象,列表对象,哈希对象,集合对象和有序集合对象;
Redis的对象系统实现了基于引用计数技术的内存回收机制;
Redis对象带有访问时间记录信息。
数据结构如下:
typedef redisObject{
unsigned type:;//类型
unsigned encoding:;//编码
void *ptr;//只想底层实现数据结构的指针
} robj;
其中,type属性记录的是对象的数据类型。因为键值总是字符串,而对象的数据类型就是上面的5种对象系统;(每种类型的对象都至少使用了两种不同的编码)
redis底层的数据结构:
不同的对象可以使用的编码类型(encoding):
可以通过OBJECT ENCODING key查看对应不同编码类型:
1.字符串对象
特点:
1.字符串对象的编码可以是int,row,或embstr;
2.最大值不能超过512M;
3.字符串对象是五种redis对象中被其他对象嵌套的对象
数据存取相关指令:
计数相关指令
注意:
1.SETEX,SETNX,可用于分布式场景,当多个客户端同时执行操作,只能有一个客户端执行成功;
2.尽量使用MSET和MGET批量处理,但是要注意数量不是无节制的,当数量太多时,可能会造成redis阻塞或网络阻塞;
3.redis是单线程架构,自增自减不会额外消耗CPU;
2.列表对象(REDIS_LIST)
特点:
1.列表对象可以是ziplist或linkedlist,linkedList使用的是双端链表作为底层实现,每个双端链表的节点都保存一个对象;
2.当满足单个字符长度小于64,元素数量小于512的时候,使用ziplist,不能就使用linkedlist
3.可以两端进行插入或弹出;
4.列表
类型的两个特点:1.有序;2.可重复;
常用操作指令
命令 | 描述 | 用法 |
LPUSH | (1)将一个或多个值value插入到列表key的表头(2)如果有多个value值,那么各个value值按从左到右的顺序依次插入表头(3)key不存在,一个空列表会被创建并执行LPUSH操作(4)key存在但不是列表类型,返回错误 | LPUSH key value [value ...] |
LPUSHX | (1)将值value插入到列表key的表头,当且晋档key存在且为一个列表(2)key不存在时,LPUSHX命令什么都不做 | LPUSHX key value |
LPOP | (1)移除并返回列表key的头元素 | LPOP key |
LRANGE | (1)返回列表key中指定区间内的元素,区间以偏移量start和stop指定(2)start和stop都以0位底(3)可使用负数下标,-1表示列表最后一个元素,-2表示列表倒数第二个元素,以此类推(4)start大于列表最大下标,返回空列表(5)stop大于列表最大下标,stop=列表最大下标 | LRANGE key start stop |
LREM | (1)根据count的值,移除列表中与value相等的元素(2)count>0表示从头到尾搜索,移除与value相等的元素,数量为count(3)count<0表示从从尾到头搜索,移除与value相等的元素,数量为count(4)count=0表示移除表中所有与value相等的元素 | LREM key count value |
LSET | (1)将列表key下标为index的元素值设为value(2)index参数超出范围,或对一个空列表进行LSET时,返回错误 | LSET key index value |
LINDEX | (1)返回列表key中,下标为index的元素 | LINDEX key index |
LINSERT | (1)将值value插入列表key中,位于pivot前面或者后面(2)pivot不存在于列表key时,不执行任何操作(3)key不存在,不执行任何操作 | LINSERT key BEFORE|AFTER pivot value |
LLEN | (1)返回列表key的长度(2)key不存在,返回0 | LLEN key |
LTRIM | (1)对一个列表进行修剪,让列表只返回指定区间内的元素,不存在指定区间内的都将被移除 | LTRIM key start stop |
RPOP | (1)移除并返回列表key的尾元素 | RPOP key |
RPOPLPUSH | 在一个原子时间内,执行两个动作:(1)将列表source中最后一个元素弹出并返回给客户端(2)将source弹出的元素插入到列表desination,作为destination列表的头元素 | RPOPLPUSH source destination |
RPUSH | (1)将一个或多个值value插入到列表key的表尾 | RPUSH key value [value ...] |
RPUSHX | (1)将value插入到列表key的表尾,当且仅当key存在并且是一个列表(2)key不存在,RPUSHX什么都不做 | RPUSHX key value |
3.哈希对象
特点:
1.哈希对象的编码可以是ziplist或者hashtable;
hasttable底层是通过字典实现的;
(键值对按照顺序排列)
2. 键和值的长度小于64,且数量都小于512的时候,使用ziplist;
3.字典数据结构特点:1.字典数据结构中每个键都是字符串对象,对象是保存了键值对的键。2。字典数据结构中每个值都是字符串对象,对象中保存了键值对的值;
(通俗点就是:string -> (无数个键值对 )->这无数个键值对中,key必定是string对象 ,java中就是Map<String,Map<String,Object>>一样的意思)
常用指令
4.集合对象
特点:
1.集合对象的编码可以是inset或hasetable;(键值对值为null的hasetable)
2.当集合对象都是int类型且当总长度不超过512;使用intset否则hashtable
常用指令
命令 | 描述 | 用法 |
SADD | (1)将一个或多个member元素加入到key中,已存在在集合的member将被忽略(2)假如key不存在,则只创建一个只包含member元素做成员的集合(3)当key不是集合类型时,将返回一个错误 | SADD key number [member ...] |
SCARD | (1)返回key对应的集合中的元素数量 | SCARD key |
SDIFF | (1)返回一个集合的全部成员,该集合是第一个Key对应的集合和后面key对应的集合的差集 | SDIFF key [key ...] |
SDIFFSTORE | (1)和SDIFF类似,但结果保存到destination集合而不是简单返回结果集(2) destination如果已存在,则覆盖 | SDIFFSTORE destionation key [key ...] |
SINTER | (1)返回一个集合的全部成员,该集合是所有给定集合的交集(2)不存在的key被视为空集 | SINTER key [key ...] |
SINTERSTORE | (1)和SINTER类似,但结果保存早destination集合而不是简单返回结果集(2)如果destination已存在,则覆盖(3)destination可以是key本身 | SINTERSTORE destination key [key ...] |
SISMEMBER | (1)判断member元素是否key的成员,0表示不是,1表示是 | SISMEMBER key member |
SMEMBERS | (1)返回集合key中的所有成员(2)不存在的key被视为空集 | SMEMBERS key |
SMOVE | (1)原子性地将member元素从source集合移动到destination集合(2)source集合中不包含member元素,SMOVE命令不执行任何操作,仅返回0(3)destination中已包含member元素,SMOVE命令只是简单做source集合的member元素移除 | SMOVE source desination member |
SPOP | (1)移除并返回集合中的一个随机元素,如果count不指定那么随机返回一个随机元素(2)count为正数且小于集合元素数量,那么返回一个count个元素的数组且数组中的元素各不相同(3)count为正数且大于等于集合元素数量,那么返回整个集合(4)count为负数那么命令返回一个数组,数组中的元素可能重复多次,数量为count的绝对值 | SPOP key [count] |
SRANDMEMBER | (1)如果count不指定,那么返回集合中的一个随机元素(2)count同上 | SRANDMEMBER key [count] |
SREM | (1)移除集合key中的一个或多个member元素,不存在的member将被忽略 | SREM key member [member ...] |
SUNION | (1)返回一个集合的全部成员,该集合是所有给定集合的并集(2)不存在的key被视为空集 | SUNION key [key ...] |
SUNIONSTORE | (1)类似SUNION,但结果保存到destination集合而不是简单返回结果集(2)destination已存在,覆盖旧值(3)destination可以是key本身 | SUNION destination key [key ...] |
5.有序集合对象
特点:
1.有序集合可以是ziplist或者skiplist;
2.ziplist根据对象分值进行排序;较小的放在表头位置;
3.skiplist底层是通过dict和zset实现的;好处是降低了数据查询的复杂度;
(skiplist结构如下:)
有序集合中,跳跃表和字典公用一份数据,但是同时各自有一份元素。
4.保存的元素数量小于128且保存的所有元素长度都小于64字节使用ziplist,否则使用 skiplist 编码。
常用指令
命令 | 描述 | 用法 |
ZADD | (1)将一个或多个member元素及其score值加入有序集key中(2)如果member已经是有序集的成员,那么更新member对应的score并重新插入member保证member在正确的位置上(3)score可以是整数值或双精度浮点数 | ZADD key score member [[score member] [score member] ...] |
ZCARD | (1)返回有序集key的元素个数 | ZCARD key |
ZCOUNT | (1) 返回有序集key中,score值>=min且<=max的成员的数量 | ZCOUNT key min max |
ZRANGE | (1)返回有序集key中指定区间内的成员,成员位置按score从小到大排序(2)具有相同score值的成员按字典序排列(3)需要成员按score从大到小排列,使用ZREVRANGE命令(4)下标参数start和stop都以0为底,也可以用负数,-1表示最后一个成员,-2表示倒数第二个成员(5)可通过WITHSCORES选项让成员和它的score值一并返回 | ZRANGE key start stop [WITHSCORES] |
ZRANK | (1)返回有序集key中成员member的排名,有序集成员按score值从小到大排列(2)排名以0为底,即score最小的成员排名为0(3)ZREVRANK命令可将成员按score值从大到小排名 | ZRANK key number |
ZREM | (1)移除有序集key中的一个或多个成员,不存在的成员将被忽略(2)当key存在但不是有序集时,返回错误 | ZREM key member [member ...] |
ZREMRANGEBYRANK | (1)移除有序集key中指定排名区间内的所有成员 | ZREMRANGEBYRANK key start stop |
ZREMRANGEBYSCORE | (1)移除有序集key中,所有score值>=min且<=max之间的成员 | ZREMRANGEBYSCORE key min max |
6.系统相关指令及key管理相关指令
系统相关指令:
key管理相关指令
命令 | 描述 | 用法 |
DEL | (1)删除给定的一个或多个key(2)不存在的Key将被忽略 | DEL key [key ...] |
EXISTS | (1)检查给定key是否存在 | EXISTS key |
EXPIRE | (1)为给定key设置生存时间,key过期时它会被自动删除(2)对一个已经指定生存时间的Key设置执行EXPIRE,新的值会代替旧的值 (3)如果设置位负值,会立刻被删除 | EXPIRE key seconds |
EXPIREAT | (1)同EXPIRE,但此命令指定的是UNIX时间戳,单位为秒 | EXPIRE key timestamp |
KEYS | (1)查找所有符合给定模式pattern的key,下面举一下例子(2)KEYS *匹配所有key(3)KEYS h?llo匹配hello、hallo、hxllo等(4)KEYS h*llo匹配hllo、heeeeello等(5)KEYS h[ae]llo匹配hello和hallo(6)特殊符号想当做查找内容经的使用\ | KEYS pattern |
MIGRATE | (1)原子性地将key从当前实例传送到目标实例指定的数据库上(2)原数据库Key删除,新数据库Key增加(3)阻塞进行迁移的两个实例,直到迁移成功、迁移失败、等待超时三个之一发生 | MIGRATE host port key destination-db timeout [COPY] [REPLACE] |
MOVE | (1)将当前数据库的key移动到给定数据库的db中(2)执行成功的条件为当前数据库有key,给定数据库没有key | MOVE key db |
dumprestore | (1)dump将键值序列化;(2)restore表示还原;一般用于不同redis实例中数据迁移 | dump keyrestore key ttl value |
PERSIST | (1)移除给定key的生存时间,将key变为持久的 | PERSIST key |
RANDOMKEY | (1)从当前数据库随机返回且不删除一个key, | RANDOMKEY |
RENAME | (1)将key改名为newkey(2)当key和newkey相同或key不存在,报错(3)newkey已存在,RENAME将覆盖旧值 | RENAME key newkey |
RENAMENX | (1)为了防止强行rename,只有在newkey不存在的情况下才能执行 | RENAMENK key newkey |
TTL | (1)以秒为单位,返回给定的key剩余生存时间 | TTL key |
PTTL | (1)以毫秒为单位,返回给定的key剩余生存时间 | PTTL key |
TYPE | (1)返回key锁存储的值的类型 | TYPE key |
注意:
1.对于字符串类型的键,set命令很容易去掉过期时间;
2.Redis不支持二级数据结构内部元素的过期功能。例如,hash对象中,值中多个KEY的过期时间无法指定
3.setex是原子操作,并且可以减少一次网络请求时间
7.类型检查和命令多态
Redis中操作间的命令分为两种。
其中一种命令可以对任何类型的键执行,比如DEL命令,EXPIRE命令,RENAME命令,TYPE命令,OBJECT命令等;
另一种是只能对特定类型键执行;
- 类型检查的实现
在执行指令的时候,服务器会先判断RedisObject的类型是否有相关的指令,没有的话,不能执行
- 多态命令的实现
一个命令可以同时用于处理多种不同类型的键;
8.内存回收
通过引用计数技术实现内存回收机制;
typedef struct redisObject{ //.....
int refcount;//引用计数
//..... }
对象引用计数信息会随着对象的使用状态而不断变化;
创建一个对象的时候,值会被初始化为1;
被新程序使用时,引用计数会增1;
不再被程序使用会减1;
当对象引用计数值为0,对象锁占用的内存会被释放;
9.对象共享
对象的引用计数属性带有对象共享的作用;
10.对象的空转时长
typedef struct redisObject{
// ...
unsigned lru : ;
// ...
}robj;
空转时长就是通过将当前时间减去键的值对象的lru时间计算得出的
Object IDLETIME 命令可以打印出给定键的空转时长;
这个命令在放键的值对象时,不会修改值对象的lru属性;
键的空转时常的另一个作用,就是当maxmemory选项设置最大值时,通过内存回收算法volatile-lru 或者 allkeys-lru,当服务器的内存超过设置的maxmemory值时,空转时长较高的部分,会被内存回收;
redis基础02-redis的5种对象数据类型的更多相关文章
- Redis 基础:Redis 数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- redis基础及redis特殊场景使用描述
数据类型 String set list hash zset redis原理 单线程:redis是单线程+io多路复用:检查文件描述的就绪状态 对比memchached:多线程+锁 redis优势 解 ...
- Redis 基础:Redis 配置
Redis 配置 Redis的配置文件位于Redis安装目录下,文件名为redis.conf.可以通过CONFIG命令查看或设置配置项.其语法为: # Redis CONFIG命令格式如下: > ...
- Redis命令操作简介及五种value数据类型
转自:https://blog.csdn.net/ty4315/article/details/52050721 Redis是使用键值存储数据,key必须是字符串value支持五种数据类型,最新版本又 ...
- Redis 基础:Redis 事件处理
Redis 事件处理 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件事 ...
- Redis基础—了解Redis是如何做数据持久化的
之前的文章介绍了Redis的简单数据结构的相关使用和底层原理,这篇文章我们就来聊一下Redis应该如何保证高可用. 数据持久化 我们知道虽然单机的Redis虽然性能十分的出色, 单机能够扛住10w的Q ...
- Redis 实战 —— 02. Redis 简单实践 - 文章投票
需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...
- Redis 基础:Redis 简介及安装
Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵守BSD ...
- Java知识系统回顾整理01基础02面向对象01类和对象
一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...
随机推荐
- webpack从单页面到多页面
前言 从上次更完webpack从什么都不懂到入门之后,好久没有更新过文章了,可能是因为自己懒了吧.今天看了下自己的索引量少了一半o(╥﹏╥)o,发现事态严重,赶紧更新一篇23333 也是因为最近踩了一 ...
- Linux文件系统--基于EXT2
一.文件系统基本知识 ① 存储在永久性存储介质,由程序按照某种格式制作的数据集合叫做文件 ② 磁盘上管理文件的文件.数据结构和操作构成磁盘文件系统,简称文件系统 ③ 文件属性 (1)名称 (2)位置 ...
- 快速升级Zabbix 5.0 版本
Zabbix 5.0 增加了很多新功能,如:垂直菜单.隐藏菜单.用户界面中的测试项目.限制代理检查.查找并替换预处理步骤 ES7支持等等...快来部署体验一把尝鲜体验 Zabbix 5.0 吧 ...
- 使用WPF实现的 喜马拉雅FM 资源下载工具
因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...
- Laravel中Homestead添加多站点时遇到问题
Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录. 首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新 ...
- PHP配合JS导出Excel大量数据
一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...
- NAT网络地址转化和DHCP
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得I ...
- 02 . Ansible高级用法(运维开发篇)
自动化任务简介 假设我们要在10台linux服务器上安装一个nginx服务,手动是如何做的? # 第一步, ssh登录NUM(1,n)服务器 # 第二步,输入对应服务器密码 # 第三步,执行命令: y ...
- IP地址、计算机名称、MAC地址如何获取
以下的操作都在“命令提示窗口”中操作. 已知IP,如何获得计算机名称 方法(1): 使用ping -i ip地址 例如已知地址为192.168.1.168. 那么使用ping -i 192.168.1 ...
- Swagger之外的选择
今天给大家安利一款接口文档生成器--JApiDocs. swagger想必大家都用过吧,非常方便,功能也十分强大.如果要说swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注解 ...