- 浏览: 149442 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (166)
- Spring (7)
- JavaSE (16)
- web (1)
- Struts2 (2)
- Maven (1)
- 面试 (8)
- Hibernate (4)
- mysql (2)
- WebSerice (2)
- 工作心得 (23)
- 北京 (1)
- 上海 (27)
- groovy (1)
- 生活 (9)
- Linux (12)
- junit (1)
- oracle (5)
- h2db嵌入式数据库 (1)
- redis (14)
- 生活感悟 (1)
- cron (1)
- tomcat (4)
- 设计模式 (7)
- 正则表达式 (1)
- html5 (2)
- 网络编程 (3)
- 微信公众号 (1)
- Java nio (5)
- jdbc (1)
- 框架漏洞 (1)
- 安全 (8)
- 分布式 (2)
- 数据结构 (5)
- xml,json (0)
- xml (1)
- json (1)
- netty (0)
- java8 (1)
- javascript (1)
- 2016计划 (1)
- Java集合源码分析 (1)
- 工作心得,jvm性能调优 (3)
- 转载 (14)
- 产品 (1)
- JVM (10)
最新评论
-
oplife:
都不太难
返利网面试 -
飞翔神话:
谢谢 7 楼 cnrainbing
联想中望面试心得体会 -
飞翔神话:
5 楼 home198979,相比您可能还差点,但是我还是有一 ...
联想中望面试心得体会 -
cnrainbing:
支持小伙子
联想中望面试心得体会 -
jahu:
这简单啊,
联想中望面试心得体会
- String 类型简介
- String 类型的命令操作
- Hash 类型简介
- Hash 类型的命令操作
String 数据类型简介
- Redis 数据库内部结构
- 键值的语法约定
- String 类型介绍
一、Redis 数据库内部结构
Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示:
伪代码:
typedef struct redisDb { int id; // 保存着数据库以整数表示的号码 dict *dict; // 保存着所有键值对数据,这个属性也被称为键空间(key space) dict *expires; // 保存着键的过期信息 dict *blocking_keys; // 实现列表阻塞原语,在列表类型一章有详细的讨论 dict *watched_keys;// 用于实现WATCH 命令 } redisDb;
因为 Redis 是一个键值对数据库( key-value pairs database ),所以它的数据库本身也是一个字典(俗称 key space)
字典的键是一个字符串对象。
字典的值则可以是包括字符串、列表、哈希表、集合或有序集在内的任意一种Redis 类型对象。
在 redisDb 结构的 dict 属性中,保存着数据库的所有键值对数据。
下图展示了一个包含 number 、book 、message 三个键的数据库—其中 number
键是一个列表,列表中包含三个整数值;book 键是一个哈希表,表中包含三个键
值对;而 message 键则指向另一个字符串。
String 数据类型简介 — 键值的语法约定
命令
Redis中的命令不区分大小写,SET与set效果是一样的。
主键(key)
可以用任何二进制序列作为key值,从形如“ foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。
String 数据类型简介 — 键值的语法约定
关于key的规则
可以用任何二进制序列作为key值。
格式约定:object-type:id:field。
不用太长的键值。不仅消耗内存,而且在数据查找中计算成本很高。
太短的键值通常也不是好主意,可读性差。
如用“user:1000:password” 来代替“u:1000:pwd”。
String类型介绍
String 是 Redis 最基本的类型,而且 String 类型是二进制安全的。意思是 Redis 的
String可以包含任何数据。比如jpg图片或者序列化的对象。从内部实现来看其实
String可以看作byte数组,最大上限是1G字节。下面是String类型的定义。
伪代码:
struct sdshdr { long len; //len是buf数组的长度 long free; //free是数组中剩余可用字节数 char buf[ ]; //char数组用于存贮实际的字符串内容 }String;
应用场景
String是最常用的一种数据类型,普通的key/value存储。
实现方式
String在Redis内部存储默认就是一个字符串,被 RedisObject 所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时 RedisObject 的 encoding 字段为int。
整体结构如下:
String类型的命令操作
- 新增相关命令
- 查询相关命令
- 修改相关命令
- 删除及其它命令
- 场景案例
新增相关命令
Set
语法:set key value
解释:把值value赋给key,如果key不存在,新增;否则,更新。
Setnx
语法:setnx key value
解释:只 insert 不 update,即,仅仅key不存在时,则设置key的值为value,并返回1,否则返回0 。setnx 是set if not exists 的缩写。
Setex
语法: setex key seconds value
解释:设置key的过期时间和值。过期时间seconds单位是秒。设置过期时间和值是原子操作,如果redis仅仅当做缓存,这个很命令很有用。
mset
语法:mset key value [key value ...]
解释:同时设置多个key-value。
msetnx
语法:msetnx key value [key value ...]
解释:所有key都不存在才执行set操作。
查询相关命令
get
语法:get key
解释:获取key所set的值。
mget
语法: mget key [key]
解释:批量获取key的值。程序一次获取多个值,可以减少网络连接损耗。
getrange
语法:getrange key star end
解释:获取存储在key中value的字串。字符串的截取有star和end决定,字符串的第一个字符编号是0,第二个是1,一次类推;如果是负数,-1是最后一个字符,-2是倒数第二个字符,一次类推。
修改相关命令
getset
语法:getset key value
解释:设置key的值,并返回key的旧值。
append
语法:append key value
解释:key存在,在旧值的后面追加value;key不存在,直接set,返回长度。
setrange (替换部分子串)
语法:setrange key offset value
解释:用value重写key值的一部分,偏移量由offset指定 。
Incr/decr
语法:incr/decr key
解释:key中如果存储的是数字,则可以通过incr递增key的值,返回递增后的值。如果key不能存在,视为初始值为0。
Incrby/decrby
语法:incrby key increment
解释:用指定的步长增加key存储的数字。如果步长increment是负数,则减。
注意:递增递减系列的函数,只能对保存的是数字的key操作,不能是字符串。
del
语法:del key [key]
解释:删除指定的key,返回删除key的个数。
strlen
语法:strlen key
解释:获取key中所存储值的长度。
场景案例
案例:博客系统的设计与开发
需求与实现
文章的访问量:定义键 post:articleID:pageView,通过INCR命令递增
自增ID:定义键article:count,通过INCR递增
存储文章的数据:伪代码如下
首先获得新文章的ID
$postID = INCR posts:count
将博客文章的诸多元素序列化成字符串
$serializedPost = serialize($title,$content,$author,$time)
把序列化后的字符串存入一个字符串类型的键中
SET post:$postID:data,$serializedPost
获取文章数据的伪代码
从Redis中读取文章的数据
$serializePost=GET post:42:data
将文章数据反序列化成文章的各个元素
$title,$content,$author,$time = unserialize($serializePost)
获取并递增文章的访问量
$count=INCR post:42:pageView
原理图如下:
Hash类型简介
- Hash数据类型的概念
- Hash数据类型的底层实现
- Hash数据类型的使用场景
Hash数据类型的概念
Redis hash 是一个 string 类型的 field 和 value 的映射表。可以将 Redis 中的 Hash 类型看成具有 String
Key 和 String Value 的 map容器。将一个对象存储为 Hash 类型,较于每个字段
都存储成 string 类型更能节省内存。每一个Hash可以存储2^32 -1个键值对。
Hash数据类型的底层实现
Hash 对应 Value 内部实际就是一个 HashMap,实际这里会有2种不同实现,这个
Hash的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储即
zipmap(压缩列表),而不会采用真正的 HashMap 结构,对应的value
redisObject 的 encoding为 zipmap,当成员数量增大时会自动转成真正的
HashMap,此时 encoding 为ht(哈希表)。
dict.h/dict 给出了这个字典的定义:
Typedef struct dict { dictType *type; // 特定于类型的处理函数 void *privdata; // 类型处理函数的私有数据 dictht ht[2]; // 哈希表(2 个) int rehashidx; // 记录rehash 进度的标志,值为-1 表示rehash 未进行 int iterators; // 当前正在运作的安全迭代器数量 } dict; //字典所使用的哈希表实现由 dict.h/dictht 类型定义: typedef struct dictht { dictEntry **table; // 哈希表节点指针数组(俗称桶,bucket) unsigned long size; // 指针数组的大小 unsigned long sizemask; // 指针数组的长度掩码,用于计算索引值 unsigned long used; // 哈希表现有的节点数量 } dictht; //dictEntry 都保存着一个键值对,以及一个指向另一个 dictEntry 结构的指针: typedef struct dictEntry { void *key;// 键 union { void *val; … } v; // 值 struct dictEntry *next;// 链往后继节点 } dictEntry;
整个字典结构可以表示如下:
Hash类型简介 — 使用场景
Hash类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,
而字段值则存储属性值。例如要存储ID为2的汽车对象,可以分别使用名为color、
name和price的3个字段来存储该辆汽车的颜色、名称和价格。个人感觉基本跟java中的domain
差不多。
使用场景
Hash类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,
而字段值则存储属性值。例如要存储ID为2的汽车对象,可以分别使用名为color、
name和price的3个字段来存储该辆汽车的颜色、名称和价格。
Hash类型的命令操作
新增相关命令
hset
语法:hset key field value
解释:设置hash表key中的field的值。如果hash表不存在,则创建,并执行设置field的值,如果hash表存在,值field的值覆盖。
hmset
语法:hash key field value[key value]
解释:批量设置hash表key的域,如果原来有值就进行覆盖。
hsetnx
语法:hsetnx key field value
解释:仅仅当field域不存在时,设置hash表field的值。
查询相关命令
hget
语法:hget key field
解释:获取哈希表key的field值。
hmget
语法:hmget key field[field]
解释:批量获取hash表的filed。
hgetall
语法:hgetall key
解释:获取hash表的所有域值。
hexits
语法:hexists key field
解释:判断hash表中是否存在某个域。
hkeys
语法:hkeys key
解释:获取hash表的所有域。
hvals
语法:hvals key
解释:获取hash表的所有域值。
hincrby
语法:hincrby key field increment
解释:hash表field域的数值增加步长increment,如果increment是负值,则是递减。如果域不存在,初始值视为0。
删除及其它相关命令
hdel
语法:hdel key field[field]
解释:删除hash的域,如果指定多个field,则删除多个。
hlen
语法:hlen key
解释:获取hash的域数量。
场景案例
该案例引自极客学院,本人未进行尝试。
本文小结
1、redis中的数据库内部结构。
2、redis中的String类型及常用命令、使用场景。
3、redis中的hash表学习及常用命令、使用场景。
发表评论
-
redis对比memcache
2016-02-03 10:58 5971 什么是redis redis是一个key-value存储 ... -
redis分区
2016-01-05 23:30 419Redis 分区 分区是分割数 ... -
Redis 管道技术
2016-01-03 21:23 779Redis是一种基于客户端-服务端模型以及请求/响应协议的TC ... -
Redis HyperLogLog
2016-01-02 23:14 654Redis 在 2.8.9 版本添加了 HyperLogLog ... -
Redis客户端连接
2016-01-02 22:07 1020Redis接受上配置监听TCP端口和Unix套接字客户端的连接 ... -
redis基准测试
2016-01-02 21:27 387Redis的基准是用来检查redis 的性能的工具。 red ... -
redis备份
2016-01-01 23:40 520redis使用save命令来备份数据库。 一、将redis中的 ... -
redis发布-订阅,事务,乐观锁
2015-12-26 23:31 572生产者-消费者 subscribe,publish SUBSC ... -
Redis的列表数据类型
2015-12-09 23:39 524List 类型概述 List 的命令操作 List 数据类型 ... -
Redis 有序集合类型概述
2015-12-06 23:05 919有序集合类型的概念 有序集合类型的底层实现 有序集合类型的应 ... -
redis中的set类型的命令操作
2015-12-01 20:53 653SADD、SREM与SPOP命令 获取集合元素的相关命令 ... -
redis集合类型概述(2-1)
2015-11-28 22:22 550集合类型的概念 集合类型的底层实现 集合类型的应用场景 ... -
redis初步学习
2015-11-26 23:26 697昨天和今天下班后初步 ...
相关推荐
Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,也就是说,散列类型不能嵌套其他的数据类型。...
Redis_安装_字符串键_1.mp4 Redis_安装_字符串键_2.mp4 Redis_安装_字符串键_3.mp4 Redis_字符串键_BitMap操作_1.mp4 Redis_字符串键_BitMap操作_2.mp4 Redis_字符串键_BitMap操作_3.mp4 Redis_字符串键_BitMap操作_...
2016122202_Redis_安装_字符串键_1.mp4 2016122202_Redis_安装_字符串键_2.mp4 2016122202_Redis_安装_字符串键_3.mp4 2016122203_Redis_字符串键_BitMap操作_1.mp4 2016122203_Redis_字符串键_BitMap操作_2.mp4 ...
Redis 是一个高性能的键值存储数据库,支持多种数据类型,包括字符串、散列、列表、集合、有序集合等。Redis 的应用场景非常广泛,包括缓存、任务列表、网站访问统计数据、过期处理、应用排行榜、分布式集群架构中的...
* 字符串类型,散列类型适合存储对象,建议使用对象类别和ID构成键名,使用字段表示对象属性,字 * 段值存储属性值,例如:car:2 price 500 ,car:2 color black,用redis命令设置散列时,命令格式
Redis 提供数据结构,例如字符串、散列、列表、集合、带有范围查询的排序集、位图、超日志、地理空间索引和流。Redis 具有内置复制、 Lua 脚本编写、 LRU 垃圾清理、事务处理和不同级别的磁盘持久性,并通过 Redis ...
Redis是Remote Dictionary Server的缩写,它使用字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样,Redis...Redis 支持的数据类型有字符串、散列、列表、集合、有序集合。
字符串类型 2. 散列类型 3. 列表类型 4. 集合类型 5. 有序集合类型 redis的应用场景 1. 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 2. 分布式集群架构中的session分离。 3. 聊天室的...
与大多数脚本语言中的字典类似,Redis字典中的键值不仅可以是简单的字符串,还可以是更为复杂的数据类型。具体而言,Redis支持以下几种数据类型: 1. **字符串**:最基本的键值对形式,可以存储任意形式的字符串...
散列类型也是字典结构的一种形式,但其键值对中的值仅限于字符串类型。这种类型非常适合用于存储对象信息,如用户资料等。 **3. 列表类型** 列表类型可以存储有序的字符串列表。它支持从两端插入和删除元素,非常...
Redis支持多种数据类型,本篇文章将对Redis的基础数据结构进行讲解,包括string(字符串)、list(列表)、set(集合)、hash(哈希)以及zset(有序集合)。掌握这些基础数据结构对使用Redis至关重要。 首先,字符...
简单来说就是用java实现远程操作redis,ip地址要找到自己linux上连网后的ip地址,在每个case文件中修改后就可以实现了,对应的test文件是实现操作文件,你可以自己写一个主程序把他们包括起来。哦,对了这里面包括了...
其支持的数据类型包括字符串、散列、列表、集合和有序集合,提供了丰富的操作命令以适应不同的存储需求。 ### Redis 的基本概念 1. **键值数据类型**: - **字符串(Strings)**:最基础的数据类型,可存储任意二...
Redis 属于键值存储数据库,其数据模型包括字符串、散列、列表、集合和有序集合等多种键值数据类型,这些类型适应了不同场景下的存储需求。例如,字符串类型可以用于简单的键值存储,散列类型适合存储结构化的对象,...
特点:高性能、高并发、丰富的数据类型支持(如字符串、列表、散列、集合、有序集合等)、支持事务和发布/订阅模式等。 二、Redis数据结构 Redis支持多种数据结构,每种数据结构都有其特定的使用场景和操作方法。 ...
在Redis中,键的数据类型始终是字符串,而值的数据类型包括字符串、列表、字典、集合和有序集合。 1. 字符串(String):这是最基础的数据类型,对应数据结构是简单的字符串。在Redis中,字符串可以用来存储各种...
2. 丰富的数据类型:Redis 支持多种数据类型,包括字符串、哈希、列表、集合和有序集合等。 3. 原子性:Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。 4. 丰富的特性:Redis 还支持 ...