表格引用地址: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种对象数据类型的更多相关文章

  1. Redis 基础:Redis 数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  2. redis基础及redis特殊场景使用描述

    数据类型 String set list hash zset redis原理 单线程:redis是单线程+io多路复用:检查文件描述的就绪状态 对比memchached:多线程+锁 redis优势 解 ...

  3. Redis 基础:Redis 配置

    Redis 配置 Redis的配置文件位于Redis安装目录下,文件名为redis.conf.可以通过CONFIG命令查看或设置配置项.其语法为: # Redis CONFIG命令格式如下: > ...

  4. Redis命令操作简介及五种value数据类型

    转自:https://blog.csdn.net/ty4315/article/details/52050721 Redis是使用键值存储数据,key必须是字符串value支持五种数据类型,最新版本又 ...

  5. Redis 基础:Redis 事件处理

    Redis 事件处理 Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件(file event):Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件事 ...

  6. Redis基础—了解Redis是如何做数据持久化的

    之前的文章介绍了Redis的简单数据结构的相关使用和底层原理,这篇文章我们就来聊一下Redis应该如何保证高可用. 数据持久化 我们知道虽然单机的Redis虽然性能十分的出色, 单机能够扛住10w的Q ...

  7. Redis 实战 —— 02. Redis 简单实践 - 文章投票

    需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...

  8. Redis 基础:Redis 简介及安装

    Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵守BSD ...

  9. Java知识系统回顾整理01基础02面向对象01类和对象

    一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...

随机推荐

  1. webpack从单页面到多页面

    前言 从上次更完webpack从什么都不懂到入门之后,好久没有更新过文章了,可能是因为自己懒了吧.今天看了下自己的索引量少了一半o(╥﹏╥)o,发现事态严重,赶紧更新一篇23333 也是因为最近踩了一 ...

  2. Linux文件系统--基于EXT2

    一.文件系统基本知识 ① 存储在永久性存储介质,由程序按照某种格式制作的数据集合叫做文件 ② 磁盘上管理文件的文件.数据结构和操作构成磁盘文件系统,简称文件系统 ③ 文件属性 (1)名称 (2)位置 ...

  3. 快速升级Zabbix 5.0 版本

    Zabbix 5.0 增加了很多新功能,如:垂直菜单.隐藏菜单.用户界面中的测试项目.限制代理检查.查找并替换预处理步骤 ES7支持等等...快来部署体验一把尝鲜体验 Zabbix 5.0 吧     ...

  4. 使用WPF实现的 喜马拉雅FM 资源下载工具

    因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...

  5. Laravel中Homestead添加多站点时遇到问题

    Homestead做Laravel的开发还是很方便的,但是在添加多站点的时候,发现几个坑,来做个记录. 首先,官方文档给了修改homestead.yaml文件的方式,只需要在sites字节下添加一个新 ...

  6. PHP配合JS导出Excel大量数据

    一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...

  7. NAT网络地址转化和DHCP

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得I ...

  8. 02 . Ansible高级用法(运维开发篇)

    自动化任务简介 假设我们要在10台linux服务器上安装一个nginx服务,手动是如何做的? # 第一步, ssh登录NUM(1,n)服务器 # 第二步,输入对应服务器密码 # 第三步,执行命令: y ...

  9. IP地址、计算机名称、MAC地址如何获取

    以下的操作都在“命令提示窗口”中操作. 已知IP,如何获得计算机名称 方法(1): 使用ping -i ip地址 例如已知地址为192.168.1.168. 那么使用ping -i 192.168.1 ...

  10. Swagger之外的选择

    今天给大家安利一款接口文档生成器--JApiDocs. swagger想必大家都用过吧,非常方便,功能也十分强大.如果要说swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注解 ...