Redis与java结合使用

Redis  开源免费的高性能key-value数据库 内置数据库

特点:
1、redis支持数据持久话,可以将内存中数据保存在磁盘中,重启的时候可以再次加载进行使用。
2、Redis不仅仅支持简单的key-value类型的数据,同时还提供listset,zset,hash等数据结构的存储。
3、Redis支持数据的备份。
2、Redis的优势
性能极高
Redis能读的速度是110000次/s,写的速度是81000次/s
丰富的数据类型
Redis支持二进制类型存储,Strings,Lists,Hashes,Sets及Ordered Sets数据类型操作。
原子
Redis的所有操作都是原子性的,同时Redis还支持几个操作全并后的原子性执行。
丰富的特性
Redis还支持publish/subscribe 发布订阅模式 通知key值过期等特性。
3、Redis的安装
redis-servcer.exe  redis服务器
redis-cli.exe       redis命令行客户端
redis-benchmar.exe  redis性能测试工具
redis-check-aof.exe AOF文件修复工具
redis.windows.conf
4、Redis简单的测试
启动Redis服务器
运行 redis-server.exe redis.windows.conf
启动Redis客户端
另开启一个窗口
redis-cli.exe
shutdown关闭服务器
客户端常用命令
Auth 命令用于检测给定密码和配置文件中的密码是否相符
Ping 命令使用客户端向Redis服务器发送一个Ping,如果服务器运作正常的话,会返回一个PONG
通常用于测试与服务器连接是否生效,或者用于测量延迟值。
QUIT命令用于关闭与当前客户端与redis服务的连接
一旦所有等待中的回复 顺利的写入到客户端,连接就会被关闭。
Select命令用于切换到指定的数据库 数据库索引号index用数字值指定,以0作为索引值。
5、Redis配置参数介绍
redis.window.conf文件中配置项如下
1、Redis默认不是守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程(window版本中不支持)

daemonize no

2)当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定(windows版本中不支持)

pidfile /var/run/redis.pid

3)指定Redis监听端口,默认端口为6379

port 6379

4)绑定的主机地址

bind 127.0.0.1

5)当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

timeout 300

6)指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice(redis版本不同会有所区别)

loglevel notice

7)日志记录方式,默认为标准输出

logfile stdout

8)设置数据库的数量,默认数据库的index为0,可以使用SELECT <dbid>命令在连接上指定数据库id

databases 16

9)指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

save <seconds> <changes>

Redis默认配置文件中提供了三个条件:

save 900 1

save 300 10

save 60 10000

分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。



10)指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

rdbcompression yes

11)指定redis的本地数据库文件名,默认值为dump.rdb

dbfilename dump.rdb

12)指定redis本地数据库存放目录,默认是./ 可以根据自己的情况更改

dir ./

13)设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

slaveof <masterip> <masterport>

14)当master服务设置了密码保护时,slav服务连接master的密码

masterauth <master-password>

15)设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭

requirepass briup

16)设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

maxclients 128

17)指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

maxmemory <bytes>

18)指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

appendonly no

19)指定更新日志文件名,默认为appendonly.aof

appendfilename appendonly.aof

20)指定更新日志条件,共有3个可选值
no:表示等操作系统进行数据缓存同步到磁盘(快)     
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)     
everysec:表示每秒同步一次(折衷,默认值)

appendfsync everysec



21)指定是否启用虚拟内存机制,默认值为no
简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

vm-enabled no

22)虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-swap-file /tmp/redis.swap

23)将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

vm-max-memory 0

24)Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

vm-page-size 32

25)设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

vm-pages 134217728

26)设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

vm-max-threads 4

27)设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

glueoutputbuf yes

28)指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

29)指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

activerehashing yes

30)指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

include /path/to/local.conf



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

1)string(字符串)
string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。
例如:
127.0.0.1:6379> SET name "briup"
OK

127.0.0.1:6379> GET name
"briup"

//删除
127.0.0.1:6379> del name
(integer) 1

注意:value中的双引号要不要都可以


2)hash(哈希)
Redis hash 是一个键值对集合。
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
例如:
127.0.0.1:6379> HMSET user username briup password 123
OK  

127.0.0.1:6379> HGETALL user
1) "username"
2) "briup"
3) "password"
4) "123"

127.0.0.1:6379> hget user username
"briup"

//删除
127.0.0.1:6379> del user
(integer) 1

例子中使用了 hash 数据类型存储了包含用户信息的用户对象。 
每个 hash 可以存储 231次方个 键值对(40多亿)。

注意:命令不区分大小写



3)list(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

127.0.0.1:6379> lpush mylist briup
(integer) 1

127.0.0.1:6379> lpush mylist hello
(integer) 2

127.0.0.1:6379> lpush mylist world
(integer) 3

127.0.0.1:6379> lrange mylist 0 0
1) "world"

127.0.0.1:6379> lrange mylist 0 1
1) "world"
2) "hello"

127.0.0.1:6379> lrange mylist 0 2
1) "world"
2) "hello"
3) "briup"

//删除
127.0.0.1:6379> del mylist
(integer) 1

列表最多可存储 231次方个元素 (每个列表可存储40多亿)


4)set(集合)
Redis的Setstring类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经存在则返回0,key对应的set不存在返回错误。

例如:
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset briup
(integer) 1
127.0.0.1:6379> sadd myset briup
(integer) 0
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
3) "briup"

//删除
127.0.0.1:6379> del myset
(integer) 1

集合中最大的成员数为231次方(每个集合可存储40多亿个成员)。



5)zset(有序集合)
Redis中 zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
例如:

127.0.0.1:6379> zadd myzset 2 briup
(integer) 1

127.0.0.1:6379> zadd myzset 0 hello
(integer) 1

127.0.0.1:6379> zadd myzset 1 world
(integer) 1

127.0.0.1:6379> zadd myzset 1 gogo
(integer) 1

127.0.0.1:6379> zrangebyscore myzset 0 4
1) "hello"
2) "gogo"
3) "world"
4) "briup"

//删除
127.0.0.1:6379> del myzset
(integer) 1

讲到这里了


8.Redis对key的操作命令
DEL 命令用于删除已存在的键。不存在的 key 会被忽略。
EXISTS 命令用于检查给定 key 是否存在。
Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。
Expireat 命令用于以时间戳(unix timestamp)格式设置 key 的过期时间。key 过期后将不再可用。
PEXPIREAT 命令用于设置 key 的过期时间,单位是毫秒。key 过期后将不再可用
PERSIST 命令用于移除给定 key 的过期时间,使得 key 永不过期。
Keys 命令用于查找所有符合给定模式 pattern 的 key,可以使用*通配符
MOVE 命令用于将当前数据库的 key 移动到给定的数据库 db 当中。
默认Redis中有16个数据库,下标分别为0-15,默认使用的是0(select 0)
通过select可以切换数据库 例如: select 3
Pttl 命令以毫秒为单位返回 key 的剩余过期时间。
TTL 命令以秒为单位返回 key 的剩余过期时间。
RANDOMKEY 命令从当前数据库中随机返回一个 key 。
Rename 命令用于修改 key 的名称 。
rename msg my_msg
Renamenx 命令用于在新的 key 不存在时修改 key 的名称 。
renamenx username name
只要新的名字在redis中不存在的时候才会修改成功
Type 命令用于返回 key 所储存的值的类型。



9)Redis对字符串(String)的操作命令
SET 命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
Get 命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。
Getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
Getset 命令用于设置指定 key 的值,并返回 key 旧的值。
Mset 命令用于同时设置一个或多个 key-value 对。
Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
Psetex 命令以毫秒为单位设置 key 的生存时间。
Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
Msetnx 命令用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对。
Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。
Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
Incrby 命令将 key 中储存的数字加上指定的增量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
Incrbyfloat 命令为 key 中所储存的值加上指定的浮点数增量值。
如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
Decr 命令将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
Decrby 命令将 key 所储存的值减去指定的减量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
Append 命令用于为指定的 key 追加值。    
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。


11)Redis对哈希(Hash)的操作命令
Hset 命令用于为哈希表中的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,旧值将被覆盖。
Hsetnx 命令用于为哈希表中不存在的的字段赋值 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。
此命令会覆盖哈希表中已存在的字段。
如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作
Hget 命令用于返回哈希表中指定字段的值。
Hmget 命令用于返回哈希表中,一个或多个给定字段的值。
如果指定的字段不存在于哈希表,那么返回一个 nil 值。
Hgetall 命令用于返回哈希表中,所有的字段和值。
Hexists 命令用于查看哈希表的指定字段是否存在。
Hlen 命令用于获取哈希表中字段的数量。
Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
Hkeys 命令用于获取哈希表中的所有字段名。
Hvals 命令返回哈希表所有字段的值。
Hincrby 命令用于为哈希表中的字段值加上指定增量值。
增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。
本操作的值被限制在 64 位(bit)有符号数字表示之内。
Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 012)Redis对列表(List)的操作命令
Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
Lpushx 将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。
Lpop 命令用于移除并返回列表的第一个元素。
Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
例如:LINSERT list before hello go
在名字为list的列表中,往元素hello之前插入数据go
Lset 通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。
Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素    ,不在指定区间之内的元素都将被删除。下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。

Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效
Rpop 命令用于移除并返回列表的最后一个元素。
Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。





13)Redis对集合(Set)的操作命令
Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
当集合 key 不是集合类型时,返回一个错误。
Scard 命令返回集合中元素的数量。
Sdiff 命令返回给定集合之间的差集。不存在的集合 key 将视为空集。
Sdiffstore 命令将给定集合之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。
Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
Sinterstore 命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖。
Sismember 命令判断成员元素是否是集合的成员。
Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。
Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
Spop 命令用于移除并返回集合中的一个随机元素。
Srandmember 命令用于返回集合中的一个随机元素。
从 Redis 2.6 版本开始, Srandmember 命令接受可选的 count 参数:
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。
Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
当 key 不是集合类型,返回一个错误。
在 Redis 2.4 版本以前, SREM 只接受单个成员值。
Sunion 命令返回给定集合的并集。不存在的集合 key 被视为空集。
Sunionstore 命令将给定集合的并集存储在指定的集合 destination 中。
Sscan 命令用于迭代集合键中的元素。


14)Redis对有序集合(sorted set)的操作命令
Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。
如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
Zcard 命令用于计算集合中元素的数量。
Zcount 命令用于计算有序集合中指定分数区间的成员数量。
Zincrby 命令对有序集合中指定成员的分数加上增量 increment
可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
分数值可以是整数值或双精度浮点数。
Zinterstore 命令计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。
Zlexcount 命令在计算有序集合中指定字典区间内成员数量。
Zrange 返回有序集中,指定区间内的成员。
其中成员的位置按分数值递增(从小到大)来排序。
具有相同分数值的成员按字典序(lexicographical order )来排列。
如果你需要成员按值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推
Zrangebylex 通过字典区间返回有序集合的成员。
Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
Zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。
Zremrangebylex 命令用于移除有序集合中给定的字典区间的所有成员。
Zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的所有成员
Zremrangebyscore 命令用于移除有序集中,指定分数(score)区间内的所有成员。
Zrevrange 命令返回有序集中,指定区间内的成员。
其中成员的位置按分数值递减(从大到小)来排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
Zrevrangebyscore 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
Zrevrank 命令返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。
排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。
使用 ZRANK 命令可以获得成员按分数值递增(从小到大)排列的排名。
Zscore 命令返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
Zunionstore 命令计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。
Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)



15)Redis中的事务
multi命令 和 exec命令
例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name tom
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set dob 2016-11-11
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name tom
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> seta dob 2016-11-11
(error) ERR unknown command 'seta'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> get dob
(nil)

例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name tom
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> hget name age
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> get age
"20"


Redis的事务中的错误分俩种:
语法错误
这种情况需要区分Redis的版本,Redis 2.6.5之前的版本会忽略错误的命令,执行其他正确的命令,2.6.5之后的版本会忽略这个事务中的所有命令,都不执行

运行错误 
运行错误表示命令在执行过程中出现错误,比如用hget命令获取string的值
这种错误在命令执行之前Redis是无法发现的,所以在事务里这样的命令会被Redis接受并执行。如果事务里有一条命令执行错误,其他命令依旧会执行


Jedis是Redis官方首选的Java客户端开发包

相关jar包
jedis-2.9.0jar
commons-pool2-2.4.2.jar

Jedis对象的使用
整个过程类似之前使用Connection对象一样,一个Jedis对象就是一个数据库连接对象,数据库是Redis内存数据库
1、创建JEdis对象
Jedis jedis = new Jedis();
或者:
Jedis jedis = new Jedis("127.0.0.1",6379);
或者:
Jedis jedis = new Jedis(new URI("redis://:passwd@127.0.0.1:6379/0"));
注意:这里最后一个0代表的时候index为0的数据库,同时这种方式必须要求有密码

2)使用Jedis对象
使用Jedis的API对redis进行操作,Jedis中的方法名和Redis中命令名基本上一模一样,所以只要了解Redis中命令的作用,那么Jedis中对应的方法的作用也是一样的.

3)关闭Jedis对象
每个Jedis对象在内部都会建立一个Socket和Redis服务器连接,所以Jedis对象使用完毕后可以进行关闭。
所以在使用junit进行基本的jedis操作测试的时候,可以编写如下代码:
意思是,在单元测试方法执行之前,junit先调用使用了@Before注解的方法,然后再调用使用了@Test注解的方法,最后再调用使用了@After注解的方法

JedisPool连接池的使用
在不同线程中使用相同的Jedis实例会发生并发错误。但是创建太多的Jedis实例也不好,因为这意味着建立很多Socket连接,也会导致不必要的错误发生。单一的Jedis实例不是线程安全的,为了避免这些问题,可以使用JEdisPool,JedisPool是一个线程安全的网络连接池,可以使用JedisPool创建一个可靠的Jedis实例,可以从池中拿到Jedis的实例。
1)创建JedisPool
JedisPool pool = new JedisPool();
或者
JedisPool pool = new JedisPool("127.0.0.1",6379);
或者
JedisPoolConfig config = new JedisPoolConfig();  
//设置最大连接数
config.setMaxTotal(80);
//设置最大空闲数
config.setMaxIdle(20);
//设置超时时间
config.setMaxWaitMillis(3000);
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379); 

2)使用JedisPool获得Jedis对象
JedisPool pool = new JedisPool();
Jedis jedis = pool.getResource();

3)从JedisPool获得的Jedis对象再使用后调用close方法即可
通过查看源码可知,close方法内部会把这个jedis对象进回收
public void close(){
if (this.dataSource != null) {
if (this.client.isBroken())
this.dataSource.returnBrokenResource(this);
else
this.dataSource.returnResource(this);
}else{
this.client.close();
}
}
10、使用JEdis存储java对象
Jedis继承了BinaryJedis类
Jedis中的方法基本上都是String类型,BinaryJedis类中的方法参数基本上都是byte[]类型的,所以Jedis对象也可以调用哪些可以接受byte[]类型的方法,而且java中任何可以被序列化的对象都可以转换为字节数组。
1、创建工具类 SerializingUtils
负责把对象和byte[]之间进行转换
2)创建工具类JedisUtils
把Jedis对Redis的操作进行封装,使其更加方便使用,例如可以直接存/取java对象,要求对象实现序列化接口,同时也可以使用之前的Jedis相关方法

11、Redis和Mybatis结合
注意 JEdis是用来操作Redis的

mybatis分为一级缓存和二级缓存

一级缓存 又叫本地缓存 是PerpetualCache类型的永久缓存,保存在执行器中BaseExecutor,而执行器又在SqlSession DefaultSqlSession中,所以一级缓存的生命周期与SqlSession是相同的。
二级缓存,又称为自定义缓存,实现了Cache  接口的类都可以作为二级缓存,所以可配置如Encache等的第三方缓存。二级缓存以namespace名称空间为其唯一标识,被保存在Configuration核心配置对象中。

所以我们可以自定义缓存类,实现mybatis提供的缓存接口Cache,其中方法使用Jedis实现,将缓存配置为Mybatis的二级缓存提供者。
mybatis中配置的
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
需要缓存的mapper.xml中配置的
<cache type="com.briup.cache.MybatisRedisCache"></cache>
Jedis相关配置文件和工具类
src下面的config.properties

封装Jedis的工具类
JedisUtils.java
SerializingUtils.java
封装MyBatis的工具类
MyBatisSqlSessionFactory.java






















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值