redis-jedis笔记整理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

启动Redis服务器
启动客户端
Redis命令目录key(建)
保存键值对set key value
查询指定键对象get key
删除给定键的对象del key1key2…
设置键过期时间EXPIRE key exptime
剩余时间ttl key
查看搜索有键值keys键
migrate指令(移动将数据移动另外一个数据)
将key原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的key会被删除。

MOVE key db
将数据库的key移动到指定的数据库db当中。

如果当前数据库(源数据库)和给定数据库(目标数据库)有相同的名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。

因此,也可以利用这一特性,将MOVE当作锁(locking)原语(primitive)。

Obejct{refcount|encoding|idletime}
通常用在debug或者了解为了节省空间使用特殊的编码情况,当redis用作缓存时候,也可以通过OBJECT命令中的信息,决定key的驱逐策略.
object refcount key:返回给定key引用所存储的值的次数.
object encoding key:返回给定key所存储的值编码可以有
raw(一般字符串)或int(用字符串表示64位数字是为了节约空间)。

ziplist或linkedlist。

ziplist是为节约大小较小的列表空间而作的特殊表示。

intset或者hashtable。

intset是只储存数字的小集合的特殊表示。

zipmap或者hashtable。

zipmap是小哈希表的特殊表示。

ziplist或者skiplist格式。

ziplist用于表示小的有序集合,而skiplist则用于表
示任何大小的有序集合。

object idletime key:返回给定key自存储的空闲时间
persist key
将key从带生存时间转换为持久的不带生存时间.
pexpire设置key的过期时间单位为毫秒
pexpireat设置过期时间戳
randomkey随机产生一个key
rename oldkey newkey修改key的名字,如果存在则覆盖,不存在则不修改
renamenx修改key的名字,如果名字存在就不修改
restore key ttl反序列化值
JavaAPI调用Redis
下载commons-pool2-2.2.jar该包是jedis依赖的第三方包.并且从网上下载到jedis客户端源码具体下载地址为https:///xetorthio/jedis该种连接方式同时也是redis官方比较推荐的一种连接方式,下载到jedis源码,并且编译打包成jar文件目前版本最高支持到redis到2.8.5.
jedis源码下载页面
redis提供了大量的指令集.具体指令可以参考http://redis.io/commands网址。

jedis作为连接redis的客户端软件,底层实际上是通过ServerSocket连接redis服务器继而实现用户和redis 内存数据库的交互。

由于redis目前官网提供的最新版本是2.8.x版本.但是注意的是目前已不再对XP系统32位提供支持,如需要需要自己编译使用.
使用Jedis连接redis数据库,实施起来没有事先想象的那么难入手,事实上使用jedis提供的API访问redis数据库还是比较轻松.创建Jedis对象,该对象用来连接Redis内存数据库.Jedis jedis=new Jedis(ip,port),ip指的是redis内存数据库所在内存数据库所在的主机ip地
址,port指的是redis呢哦存数据库服务的端口号,默认是6379.Redis是一个key-value存储系统。

和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。

以下是针对jedis对redis内存数据库访问的数据类型做为学习和使用的路线介绍.Redis数据库,默认的可以讲数据库的库表分成0~15个子库,每个库之间独立.使用move指令实现多个子库之间数据的迁移。

默认使用0号子库。

如果用户有特殊需求可以使用select指令在执行其他指定之前选着相应的子库。

例如jedis.select(0)就表示用户的操作是在0号子库下完成.
一、String操作
(1)保存字符串key-value类型数据.默认保存的数据会永久的保存在磁盘上,数据不会丢失.
(2)保存数据key-value指定过期时间数据,过期时间是以秒为单位.
(3)保存数据如果存在新的数据就不会覆盖.
(4)在字符串自定位置覆盖
(5)字符串追加Append
(6)一次添加多个key-value,键值必须成对出现
(7)一次添加多个key-value,键值必须成对出现,要求如果存在就取消此次插入操作.
(8)获取单个key的值
(9)批量获取key-value
(9)删除键值对
(10)判断键是否存在
(11)清空指定DB子库该操作需要谨慎使用
(12)清除所有子库
二、List操作
(1)往list插入值
(2)修改List指定位置的值
(3)获取List集合里面的值
(4)删除集合元素
(5)删除集合
(6)获取指定下标数据
(7)在指定数据项之前/后插入数据
(8)添加数据到List中,如果集合不存在就不再添加返回值是表示添加的下标如果集合不存
在就返回0
(9)获取数组的长度
(10)元素出栈操作
(11)删除指定下标范围内的数据
三、HashSet和Sortedset
(1)添加一条数据,帮助去除重复
(2)获取集合数据
(3)获取元素个数
(4)判断某个元素是不是set的成员
(5)删除指定项数据
(6)获取set中所有数据
(7)从set栈中弹出信息
(8)计算两个set集合之间的交集
(9)计算两个set集合之间的并集
(10)计算两个set集合之间的差集
(11)SotedSet添加元素
(12)获取sortedset中的元素
(13)获取元素score
(14)获取元素个数
(15)删除指定元素
(16)获取指定score范围内的元素
(17)获取指定score内元素的个数
四、HashMap
(1)添加Map到数据库
(2)获取Map中的参数
(3)获取整个map中的值
(4)判断某个key是否存在
(5)遍历map的所有键
(6)遍历map中的所有值
(7)获取所有键的歌词
(8)添加一条记录到map,如果存在就不添加
(9)删除map中的指定项
(10)删除map中指定的key
(11)删除整个map
五、Pipelline
redis是一个CS模式的并且是基于TCP的客户端服务器,客户端通过发送socket连接发起多个请求,每个请求发送出去后程序一般处于阻塞状态,等待redis服务器的处理,redis处理完后将处理后的报文发送给客户端.这种阻塞式没有充分利用到redis的处理能力,处理可以使用mest/mget单条指令来处理多个key的命令,一般还可以使用pipleline方式,该方式是通过打包客户端指令形式,将数据打包发送给服务器就无需等待单条指令的返回,redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。

需要注意的是redis 在处理所有打包数据之前,必须缓存所有指令的处理结果,打包发送虽然可以解决原先在网络延迟上的时间,但是由此会带来内存的消耗,因此并不是打包指令越多越好。

下面做一个性能测试,第一个使用普通的方式实现往redis数据库中插入10万条数据情况下测试时间如下:
使用pipleline打包指令发送.
总结:pipleline一般用来批量操作是为了提高操作效率节省网络延迟带来的时间损耗,可以考虑使用pipleline方式实现数据操作指令的打包发送。

六、排序
Redis从1.0.0版本开始支持对于保存在list、set、sorted set的数据排序,默认情况下,支持对数值类型的数据或者字符串排序。

(1)简单排序
(2)使用SortingParams排序
(3)以上两种使用的排序都是针对数值类型的数据排序,如果需要对非数值类型的排序需要
使用alpha参数实现排序.
(4)排序后分页查询
(5)按照外部key排序
有时候你希望使用外部的集合的值作为权重来排序而并不是查询出集合本身来排序,此时需要使用by语句作为查询.
(6)对hashMap中的数据来进行排序操作.
七、池化
多线程下使用同一个Jedis实例是不切合实际的,线程不安全,可是如果创建太多Jedis实例,也会给服务器造成一定的压力和负载,为了挺高redis在多线程的表现,可以使用JedisPool,JedisPool是线程安全的网络连接池。

一般可以通过JedisPool创建一个可靠的Jedis实例。

用户可以从池中获取Jedis连接。

八、分布式处理
需要注意对于Redis2.X版本不支持集群功能,Redis在3.0后将实现集群机制,目前Redis实现集权的方法主要是采用一致性hash分片(Shard),将不同的key分别分配到不同的Redis服务器上,达到横向扩展的目的。

一般可以通过JedisShardInfo获知某一个键存储的目标主机信息.
使用该种方式的集群会出现以下两个问题,分别是扩容问题、单点故障问题。

九、Redis的Master/Slave
Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb 文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中。

Redis
的复制功能是完全建立在Redis的内存快照的是持久化策略上,无论持久化策略是什么,只要用到Redis的复制功能,就一定会有内存快照的发生,Slave端向master发送同步指令,简单判断是否又正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。

Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构。

Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理。

切换为从机模式:
切换成主机模式
注意:
Slave从库在连接Master主库时,Master会进行内存快照,然后把整个快照文件发给Slave,也就是没有象MySQL那样有复制位置的概念,即无增量复制,这会给整个集群搭建带来非常多的问题。

比如一台线上正在运行的Master主库配置了一台从库进行简单读写分离,这时Slave由于网络或者其它原因与Master断开了连接,那么当Slave 进行重新连接时,需要重新获取整个Master的内存快照,Slave所有数据跟着全部清除,然后重新建立整个内存表,一方面Slave恢复的时间会非常慢,另一方面也会给主库带来压力。

所以基于上述原因,如果你的Redis集群需要主从复制,那么最好事先配置好所有的从库,避免中途再去增加从库。

思考:Redis的定位(缓存/存储)
在我们分析过了Redis的复制与持久化功能后,我们不难得出一个结论,实际上Redis目前发布的版本还都是一个单机版的思路,主要的问题集中在,持久化方式不够成熟,复制机制存在比较大的缺陷,这时我们又开始重新思考Redis的定位:Cache还是Storage?如果作为Cache的话,似乎除了有些非常特殊的业务场景,必须要使用Redis 的某种数据结构之外,我们使用Memcached可能更合适,毕竟Memcached无论客户端包和服务器本身更久经考验。

如果是作为存储Storage的话,我们面临的最大的问题是无论是持久化还是复制都没有办法解决Redis单点问题,即一台Redis挂掉了,没有太好的办法能够快速的恢复,通常几十G的持久化数据,Redis重启加载需要几个小时的时间,而复制又有缺陷,如何解决呢?
十、事物
redis是著名key-value存储系统,二而作为官方推荐客户端Jedis非常强大支持事物,管道以及jedis自身提供的分布式。

redis的事物可以保障一个Client发起的事物命令可以连续的执行,而中间不会插入其他的Client命令。

(1)简单事物
(2)事物执行标准代码
(3)使用watch来实施类似hibernate乐观锁
十一、其他操作
(1)关闭redis
(2)获取redis db大小
(3)查看某一个key-value过期时间
(4)指定过期时间
(5)查询key
(6)修改key值。

相关文档
最新文档