redis入门——客户端篇
@(Redis)[redis, 入门, 客户端命令, jdeis]
- redis入门客户端篇
- redis的客户端
- redis-cli
- redis-desktop-manager
- jedis
- redis客户端的使用以redis-cli为例
- redis的数据类型
- redis的各个数据类型的常用命令
- 常用命令
- String
- 基本介绍
- 命令实例
- 字符整数命令
- 二进制命令
- List
- 基本介绍
- 命令实例
- Hash
- 基本介绍
- 命令实例
- Set
- 基本介绍
- 命令实例
- 基本命令
- 集合命令
- SortedSet
- 基本介绍
- 命令实例
- Key
- 基本介绍
- 命令实例
- jedis基本使用
- jedis工具类
- jedis使用案例
- redis的客户端
redis的客户端
redis-cli
redis-cli
是redis自带的客户端,是功能最完善的,不过因为其是基于命令行的,不是特别直观。
使用redis-cli
命令默认连接127.0.0.1(localhost)
在6379
端口的服务。可以通过一些参数来指定主机和端口。
– - h
:指定连接服务器的ip地址。
– - p
:指定redis服务的端口号
PS:比如在《redis入门——安装篇》中使用redis-cli
关闭6401
端口号上的redis服务时,就使用了- p
参数。
如果我想连接服务器主机IP为127.0.0.1
上的6401
端口的redis服务,可以通过如下命令访问:
[root@iZ28xuvyce3Z bin]# ./redis-cli -h 127.0.0.1 -p 6401
127.0.0.1:6401>
redis-desktop-manager
redis-desktop-manager是一个第三方跨平台redis的客户端,提供了图形化界面的方式操作redis数据库。
可以从官网下载该软件,现在mac os和Ubuntu版的直装版需要订阅才能获取,不过可以通过获取源代码的方式,本地编译,具体官网有教程。windows和其他Linux,像是cent os目前还是免费提供直装版的。
使用rdm连接redis服务器时需要注意防火墙是否开启端口,如果只是测试环境,可以把防火墙关闭。具体操作如下
- 防火墙开启对应端口
[root@iZ28xuvyce3Z bin]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6401 -j ACCEPT
[root@iZ28xuvyce3Z bin]# service iptables restart
- 关闭防火墙
[root@iZ28xuvyce3Z bin]# service iptables stop
Redirecting to /bin/systemctl stop iptables.service
[root@iZ28xuvyce3Z bin]# chkconfig iptables off
jedis
下载地址:GitHub:jedis
在java程序中可以使用Jedis和JedisPool操作redis。
关于Jedis的使用,在接下来的博文中会有简单的入门案例。
redis客户端的使用(以redis-cli为例)
redis的数据类型
redis是key-value形式的nosql数据库,其数据类型如下:
redis的各个数据类型的常用命令
常用命令
String
基本介绍
redis中没有使用C语言的字符串表示,而是自定义了一个叫SDS(simple dynamic string)即简单动态字符串,使用这个数据结构来实现字符串类型。
– SDS的数据结构
struct sdshdr {//字符串长度unsigned int len;//buf数组中未使用的字节数量unsigned int free;//用于保存字符串char buf[];
};
在Redis中,key和value中的string类型都是使用sds来实现的。
c语言对字符串的存储是使用字符数组,遇到’\0’字符则认为字符串结束,redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的char buf[]就是存储了二进制数据。
redis的字符串是二进制安全的,什么是二进制安全?简单理解就是存入什么数据取出的还是什么数据。redis中的sds不像c语言处理字符串那样遇到’\0’字符则认证字符串结束,它不会对存储进去的二进制数据进行处理,存入什么数据取出还是什么数据。
命令实例
字符整数命令
- 添加
SET key value [EX seconds] [PX milliseconds] [NX|XX]
127.0.0.1:6401> set name Switch
OK
127.0.0.1:6401>
- 获取
GET key
127.0.0.1:6401> get name
"Switch"
127.0.0.1:6401>
- 自增整数一
INCR key
- 当存储的字符串是整数时,可以使用该命令自增。
- 作为计数器使用、生成主键。
127.0.0.1:6401> set time 10
OK
127.0.0.1:6401> get time
"10"
127.0.0.1:6401> incr time
(integer) 11
127.0.0.1:6401> incr time
(integer) 12
127.0.0.1:6401>
- 自增指定整数
INCRBY key increment
- 指定整数为负数,则为减去相应整数
127.0.0.1:6401> incrby time 5
(integer) 17
127.0.0.1:6401> incrby time -2
(integer) 15
127.0.0.1:6401>
- 自减整数一
DECR key
127.0.0.1:6401> decr time
(integer) 14
127.0.0.1:6401> decr time
(integer) 13
127.0.0.1:6401>
- 自减指定整数
DECRBY key decrement
127.0.0.1:6401> decrby time 6
(integer) 7
127.0.0.1:6401> decrby time 3
(integer) 4
127.0.0.1:6401>
- 同时设置获取多个值
MSET key value [key value ...]
MGET key [key ...]
127.0.0.1:6401> mset age 20 city "北京"
OK
127.0.0.1:6401> mget age city
1) "20"
2) "\xe5\x8c\x97\xe4\xba\xac"
127.0.0.1:6401>
PS:存入Redis中的汉字,在redis-cli
中是以编码的方式获取的,其本身还是对应汉字。在java中使用jedis获取时,则是相应汉字。
- 获取字符串长度
STRLEN key
127.0.0.1:6401> get name
"Switch"
127.0.0.1:6401> strlen name
(integer) 6
127.0.0.1:6401>
- 向字符串尾部追加值
APPEND key value
127.0.0.1:6401> get name
"Switch"
127.0.0.1:6401> append name " Kity"
(integer) 11
127.0.0.1:6401> get name
"Switch Kity"
127.0.0.1:6401> get n
(nil)
127.0.0.1:6401> append n 123456
(integer) 6
127.0.0.1:6401> get n
"123456"
127.0.0.1:6401>
PS:可以看出,当附加的key不存在时,则append
和set
功能一样。
二进制命令
- 设置或清除指定偏移量上的位
SETBIT key offset value
127.0.0.1:6401> setbit bit 100 1
(integer) 0
127.0.0.1:6401>
- 获取指定偏移量上的位
127.0.0.1:6401> getbit bit 100
(integer) 1
127.0.0.1:6401> getbit bit 1
(integer) 0
127.0.0.1:6401> get bit
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b"
127.0.0.1:6401>
- 计算给定字符串中,被设置为1的比特位的数量
127.0.0.1:6401> get name
"Switch Kity"
127.0.0.1:6401> bitcount name
(integer) 43
127.0.0.1:6401> get bit
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b"
127.0.0.1:6401> bitcount bit
(integer) 1
127.0.0.1:6401>
还有两个二进制命令:
一个是BITOP
,具体命令为BITOP operation destkey key [key ...]
,其功能是:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
还有一个是BITFIELD
,具体命令为BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
,其功能是将一个 Redis 字符串看作是一个由二进制位组成的数组, 并对这个数组中储存的长度不同的整数进行访问。
这两个命令想了解,可以查官方文档。
List
基本介绍
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,从列表两边删除元素,或者获得列表的某一个片段。
在Redis中散列表类型实现方式有两种,一种是压缩列表(zip list),一种是双向链表(double linked list)。压缩列表适用于包含少量值,且值要么就是小整数值,要么就是长度比较短的字符串。双向链表则是压缩列表不适用时使用。这里只讨论双向链表作为底层实现。
当使用双向链表实现时,向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
注意:Redis的双向链表实现是双向无环链表,也就是说表头的prev
和表尾的next
指针都为NULL
。
因为列表类型内部使用的双向链表,所以完全可以通过该类型实现栈、队列、双端队列等数据结构。
- DLL的数据结构
// 链表节点
typedef struct listNode {// 前置节点struct listNode *prev;// 后置节点struct listNode *next;// 节点的值void *value;
}listNode;// 双向链表
struct list {// 表头节点listNode *head;// 表尾结点listNode *tail;// 链表所包含的节点数量unsigned long len;// 一些函数...
}
命令实例
- 从左边向list中添加元素
LPUSH key value [value ...]
127.0.0.1:6401> lpush names "Switch" "Kity" "TOM"
(integer) 3
127.0.0.1:6401> lrange names 0 -1
1) "TOM"
2) "Kity"
3) "Switch"
127.0.0.1:6401>
- 从右边向list添加元素
RPUSH key value [value ...]
127.0.0.1:6401> rpush names2 "Switch" "Kity" "TOM"
(integer) 3
127.0.0.1:6401> lrange names2 0 -1
1) "Switch"
2) "Kity"
3) "TOM"
127.0.0.1:6401>
PS:从上面连个命令可以看出,lpush
是向表头结点添加元素,rpush
是向表尾结点添加元素。
- 从list左边取一个元素
LPOP key
127.0.0.1:6401> lrange names2 0 -1
1) "Switch"
2) "Kity"
3) "TOM"
127.0.0.1:6401> lpop names2
"Switch"
127.0.0.1:6401> lrange names2 0 -1
1) "Kity"
2) "TOM"
127.0.0.1:6401>
- 从list右边取一个元素
RPOP key
127.0.0.1:6401> lrange names2 0 -1
1) "Kity"
2) "TOM"
127.0.0.1:6401> rpop names2
"TOM"
127.0.0.1:6401> lrange names2 0 -1
1) "Kity"
127.0.0.1:6401>
- 查询元素列表
LRANGE key start stop
127.0.0.1:6401> lrange names 0 1
1) "TOM"
2) "Kity"
127.0.0.1:6401> lrange names 0 2
1) "TOM"
2) "Kity"
3) "Switch"
127.0.0.1:6401> lrange names 0 -1
1) "TOM"
2) "Kity"
3) "Switch"
127.0.0.1:6401>
PS:LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
- 查看列表的长度
LLEN key
127.0.0.1:6401> lrange names 0 -1
1) "TOM"
2) "Kity"
3) "Switch"
127.0.0.1:6401> llen names
(integer) 3
127.0.0.1:6401>
- 删除列表中指定的值
LREM key count value
127.0.0.1:6401> lrange names 0 -1
1) "TOM"
2) "Kity"
3) "Switch"
4) "TOM"
5) "TOM"
6) "TOM"
127.0.0.1:6401> lrem names 2 "TOM"
(integer) 2
127.0.0.1:6401> lrange names 0 -1
1) "Kity"
2) "Switch"
3) "TOM"
4) "TOM"
127.0.0.1:6401>
LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
– count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
– count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
– count = 0 : 移除表中所有与 value 相等的值。
- 获得/设置指定索引的元素值
LINDEX key index
LSET key index value
127.0.0.1:6401> lrange names 0 -1
1) "Kity"
2) "Switch"
3) "TOM"
4) "TOM"
127.0.0.1:6401> lindex names 2
"TOM"
127.0.0.1:6401> lset names 2 "JOHN"
OK
127.0.0.1:6401> lrange names 0 -1
1) "Kity"
2) "Switch"
3) "JOHN"
4) "TOM"
127.0.0.1:6401>
- 只保留列表指定片段,指定范围和LRANGE一致
LTRIM key start stop
127.0.0.1:6401> lrange l:list 0 -1
1) "6"
2) "5"
3) "0"
4) "2"
127.0.0.1:6401> ltrim l:list 0 2
OK
127.0.0.1:6401> lrange l:list 0 -1
1) "6"
2) "5"
3) "0"
- 向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6401> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6401> linsert list after 3 4
(integer) 4
127.0.0.1:6401> lrange list 0 -1
1) "3"
2) "4"
3) "2"
4) "1"
PS:该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
- 将元素从一个列表转移到另一个列表中
RPOPLPUSH source destination
127.0.0.1:6401> rpoplpush list newlist
"1"
127.0.0.1:6401> lrange newlist 0 -1
1) "1"
127.0.0.1:6401> lrange list 0 -1
1) "3"
2) "4"
3) "2"
Hash
基本介绍
散列类型(hash)它提供了键和值的映射。
注意:这里的键是散列类型里面的键,而不是在Redis中标识这个散列的键。也就是说,一个Redis键指向的散列类型里面有多个键值对。
值只能是字符串类型,不支持散列类型、集合类型等其它类型。为什么值不支持其他类型了,这是因为Redis设计者处于简单、高效考虑,不去支持这种复杂类型的嵌套。且使用这五种值类型,已经能满足绝大部分需求了。
在Redis中散列类型实现方式有两种、一种是压缩列表(zip list),一种是字典(dictionary),压缩列表适用于当散列中所有键和值的内容要么就是小整数,要么就是短字符串的情况。使用字典则是其他情况。这里只讨论字典作为底层实现。
- 字典的数据结构
// 哈希表节点
typedef struct dictEntry {// 键void *key;// 值union {void *val;unit64_t u64;int64_t s64;} v;// 指向下个哈希表节点,形成链表struct dictEntry *next;
} dictEntry;// 哈希表
typedef struct dictht {// 哈希表数组dictEntry **table;// 哈希表大小unsigned long size;// 哈希表大小掩码,用于计算索引值// 总是等于size-1unsigned long sizemask;// 该哈希表已有节点数量unsigned long used;
} dictht;// 字典
typedef struct dict {// 类型特定函数...// 私有数据void *privdata;// 哈希表dictht ht[2];// rehash索引// 当rehash不在进行时,值为-1int trehashidx;
} dict;
字典之所以有持有两个哈希表的原因是因为,在使用一张哈希表的时候,将键值对存入这张使用的表的时候,同时存入另一张表,这样渐进式的rehash,可以将时间复杂度平摊到每次操作上。
hash表节点之所以有一个指向下个哈希表节点的指针是因为,hash算法不可能做到完美hash,即每个存入值hash值都不相同。那么,就有可能发生冲突,这时候就需要解决键冲突问题了。Redis中的哈希表采用的是链地址法,也就是说,每个hash值相同的键,通过链表相连接。
命令实例
- 添加元素
HSET key field value
127.0.0.1:6401> hset customer:1 name "Switch"
(integer) 1
127.0.0.1:6401> hset customer:1 age "20"
(integer) 1
127.0.0.1:6401> hset customer:1 gender "male"
(integer) 1
127.0.0.1:6401>
- 获取元素
HGET key field
127.0.0.1:6401> hget customer:1 name
"Switch"
127.0.0.1:6401> hget customer:1 age
"20"
127.0.0.1:6401> hget customer:1 gender
"male"
127.0.0.1:6401>
- 批量添加元素
HMSET key field value [field value ...]
127.0.0.1:6401> hmset customer:2 name "Kity" age "21" gender "female"
OK
127.0.0.1:6401>
- 批量获取数据
HMGET key field [field ...]
127.0.0.1:6401> hmget customer:2 name age gender
1) "Kity"
2) "21"
3) "female"
127.0.0.1:6401> hmget customer:1 name age gender
1) "Switch"
2) "20"
3) "male"
127.0.0.1:6401>
- 删除指定域
HDEL key field [field ...]
127.0.0.1:6401> hmset customer:3 name "TOM" age "21" gender "male"OK
127.0.0.1:6401> hmget customer:3 name age gender
1) "TOM"
2) "21"
3) "male"
127.0.0.1:6401> hdel customer:3 name
(integer) 1
127.0.0.1:6401>
- 获取所有域和域对应的值
HGETALL key
127.0.0.1:6401> hgetall customer:1
1) "name"
2) "Switch"
3) "age"
4) "20"
5) "gender"
6) "male"
127.0.0.1:6401>
- 获取所有域
HKEYS key
127.0.0.1:6401> hkeys customer:1
1) "name"
2) "age"
3) "gender"
127.0.0.1:6401>
- 获取所有域对应的值
HVALS key
127.0.0.1:6401> hvals customer:1
1) "Switch"
2) "20"
3) "male"
127.0.0.1:6401> hvals customer:2
1) "Kity"
2) "21"
3) "female"
127.0.0.1:6401>
- 给值加上增量
HINCRBY key field increment
127.0.0.1:6401> hget customer:1 money
"200"
127.0.0.1:6401> hincrby customer:1 money 100
(integer) 300
127.0.0.1:6401> hget customer:1 money
"300"
127.0.0.1:6401>
- 判断域是否存在
HEXISTS key field
127.0.0.1:6401> hkeys customer:1
1) "name"
2) "age"
3) "gender"
4) "money"
127.0.0.1:6401> hexists customer:1 name
(integer) 1
127.0.0.1:6401> hexists customer:1 n
(integer) 0
127.0.0.1:6401>
- 获取域的数量
HLEN key
127.0.0.1:6401> hkeys customer:1
1) "name"
2) "age"
3) "gender"
4) "money"
127.0.0.1:6401> hkeys customer:2
1) "name"
2) "age"
3) "gender"
127.0.0.1:6401> hkeys customer:3
1) "age"
2) "gender"
127.0.0.1:6401> hlen customer:1
(integer) 4
127.0.0.1:6401> hlen customer:2
(integer) 3
127.0.0.1:6401> hlen customer:3
(integer) 2
127.0.0.1:6401>
Set
基本介绍
在集合(Set)类型中元素是无序和不同的。由此可以推测出,我们需要存储一些不需要顺序,且各个唯一的数据时,集合就是种不错的类型。
集合类型的底层实现有两种,一种是整数集合(int set),一种是字典。当集合所有对象都是整数值且元素个数不超过512个时,会使用整数集合。其他情况都是使用字典,这里也只讨论字典情况。
字典的数据类型在散列类型的介绍中已经给出,这里不再赘述。
集合类型使用字典的方式和散列使用的方式略有不同,集合只使用字典的键,而字典的值全部是被设置为NULL。也就是说集合只使用dictEntry
中的key。
命令实例
基本命令
- 向集合中添加元素
SADD key member [member ...]
127.0.0.1:6401> sadd sname "Switch" "Kity" "TOM"
(integer) 3
127.0.0.1:6401> smembers sname
1) "Kity"
2) "TOM"
3) "Switch"
127.0.0.1:6401>
- 从集合中删除元素
SREM key member [member ...]
127.0.0.1:6401> srem sname "TOM"
(integer) 1
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401>
- 返回集合中的所有元素
SMEMBERS key
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401>
- 判断元素是否在集合中
SISMEMBER key member
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> sismember sname "SWITCH"
(integer) 0
127.0.0.1:6401> sismember sname "TOM"
(integer) 0
127.0.0.1:6401> sismember sname "Switch"
(integer) 1
127.0.0.1:6401>
- 获取集合中元素的数量
SCARD key
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> scard sname
(integer) 2
127.0.0.1:6401>
集合命令
- 集合的交集
- SINTER key [key …]
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> smembers sname2
1) "JACK"
2) "Switch"
3) "JOHN"
4) "TOM"
127.0.0.1:6401> sinter sname sname2
1) "Switch"
127.0.0.1:6401>
- 集合的并集
SUNION key [key ...]
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> smembers sname2
1) "JACK"
2) "Switch"
3) "JOHN"
4) "TOM"
127.0.0.1:6401> sunion sname sname2
1) "JACK"
2) "Kity"
3) "JOHN"
4) "Switch"
5) "TOM"
127.0.0.1:6401>
- 集合的差集
SDIFF key [key ...]
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> smembers sname2
1) "JACK"
2) "Switch"
3) "JOHN"
4) "TOM"
127.0.0.1:6401> sdiff sname sname2
1) "Kity"
127.0.0.1:6401>
集合还有三个命令,分别是SINTERSTORE
、SUNIONSTORE
、SDIFFSTORE
。其作用都是做了集合运算之后,将结果存入一个指定集合。
三个命令分别是:
– SINTERSTORE destination key [key ...]
– SUNIONSTORE destination key [key ...]
– SDIFFSTORE destination key [key ...]
这里只给出一个命令的实例,其余两个都差不多。
127.0.0.1:6401> smembers sname
1) "Kity"
2) "Switch"
127.0.0.1:6401> smembers sname2
1) "JACK"
2) "Switch"
3) "JOHN"
4) "TOM"
127.0.0.1:6401> sunionstore sname3 sname sname2
(integer) 5
127.0.0.1:6401> smembers sname3
1) "JACK"
2) "Kity"
3) "JOHN"
4) "Switch"
5) "TOM"
127.0.0.1:6401>
SortedSet
基本介绍
有序集合(SortedSet)类型是在集合的基础上,为集合中的每个元素关联了一个分数(Score),通过这样的机制,不仅可以完成对集合元素的插入、删除、判重。还可以通过分数获取有序集合中最高或者最低的前N个元素、获取指定分数范围内的元素等。
有序集合类型的底层实现有两种,一种是压缩列表,一种是跳跃表(skip list)。因为两者的复杂性,这里都不介绍。如果想要了解,可以参考该博文底部的参考文档书籍。
命令实例
- 向有序集合中添加元素
ZADD key score member [[score member] [score member] ...]
127.0.0.1:6401> zadd zname 100 "Switch" 200 "Kity"
(integer) 2
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
127.0.0.1:6401>
- 从有序集合中删除元素
ZREM key member [member ...]
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
127.0.0.1:6401> zrem zname "Switch"
(integer) 1
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Kity"
2) "200"
127.0.0.1:6401>
- 查看有序集合中的元素(顺序)
ZRANGE key start stop [WITHSCORES]
127.0.0.1:6401> zadd zname 100 "Switch" 300 "Tom" 400 "Card"
(integer) 3
127.0.0.1:6401> zrange zname 0 -1
1) "Switch"
2) "Kity"
3) "Tom"
4) "Card"
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zrange zname 0 2
1) "Switch"
2) "Kity"
3) "Tom"
127.0.0.1:6401>
- 查看有序集合中的元素(逆序)
ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6401> zrevrange zname 0 -1
1) "Card"
2) "Tom"
3) "Kity"
4) "Switch"
127.0.0.1:6401> zrevrange zname 0 -1 withscores
1) "Card"
2) "400"
3) "Tom"
4) "300"
5) "Kity"
6) "200"
7) "Switch"
8) "100"
127.0.0.1:6401> zrevrange zname 0 1
1) "Card"
2) "Tom"
127.0.0.1:6401>
- 获取指定分数范围内的成员数量
ZCOUNT key min max
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zcount zname 150 350
(integer) 2
127.0.0.1:6401> zcount zname 57 165
(integer) 1
127.0.0.1:6401>
- 获取元素的排名(正序)
ZRANK key member
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zrank zname "Switch"
(integer) 0
127.0.0.1:6401>
- 获取元素的排名(逆序)
ZREVRANK key member
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zrevrank zname "Switch"
(integer) 3
127.0.0.1:6401>
- 获取元素的分数
ZSCORE key member
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zscore zname "Switch"
"100"
127.0.0.1:6401>
- 增加元素的分数
ZINCRBY key increment member
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "400"
127.0.0.1:6401> zincrby zname 66 "Card"
"466"
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "466"
127.0.0.1:6401>
- 获取成员数量
ZCARD key
127.0.0.1:6401> zrange zname 0 -1 withscores
1) "Switch"
2) "100"
3) "Kity"
4) "200"
5) "Tom"
6) "300"
7) "Card"
8) "466"
127.0.0.1:6401> zcard zname
(integer) 4
127.0.0.1:6401>
Key
基本介绍
键(key)是字符串类型,它的概念很好理解,就是Redis数据库中上述五种对象的索引。在Redis中,其数据库整体的底层就是在散列类型里面介绍的字典。由此,可以得出一个结论,键的操作是通用的。也就是说,任何键的操作,比如删除,更新,对任何的值类型都是一样的。
命令实例
- 获取所有符合给定模式的key
KEYS pattern
127.0.0.1:6401> keys *1) "time"2) "city"3) "bii"4) "bi"5) "names"6) "name"7) "zname"8) "sname2"9) "age"
10) "customer:3"
11) "customer:2"
12) "n"
13) "names2"
14) "sname"
15) "customer:1"
16) "sname3"
17) "bit"
127.0.0.1:6401>
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
- 删除指定的key
DEL key [key ...]
127.0.0.1:6401> keys *1) "time"2) "city"3) "bii"4) "bi"5) "names"6) "name"7) "zname"8) "sname2"9) "age"
10) "customer:3"
11) "customer:2"
12) "n"
13) "names2"
14) "sname"
15) "customer:1"
16) "sname3"
17) "bit"
127.0.0.1:6401> del time city bii bi
(integer) 4
127.0.0.1:6401> keys *1) "names"2) "name"3) "zname"4) "sname2"5) "age"6) "customer:3"7) "customer:2"8) "n"9) "names2"
10) "sname"
11) "customer:1"
12) "sname3"
13) "bit"
127.0.0.1:6401>
- 检查给定key是否存在
EXISTS key
127.0.0.1:6401> keys *1) "names"2) "name"3) "zname"4) "sname2"5) "age"6) "customer:3"7) "customer:2"8) "n"9) "names2"
10) "sname"
11) "customer:1"
12) "sname3"
13) "bit"
127.0.0.1:6401> exists names
(integer) 1
127.0.0.1:6401> exists aaa
(integer) 0
127.0.0.1:6401>
- 查看key所存储值的类型
TYPE key
127.0.0.1:6401> keys *1) "names"2) "name"3) "zname"4) "sname2"5) "age"6) "customer:3"7) "customer:2"8) "n"9) "names2"
10) "sname"
11) "customer:1"
12) "sname3"
13) "bit"
127.0.0.1:6401> type names
list
127.0.0.1:6401> type age
string
127.0.0.1:6401> type customer:1
hash
127.0.0.1:6401> type sname
set
127.0.0.1:6401> type zname
zset
127.0.0.1:6401>
- 设置key的有效期
EXPIRE key seconds
127.0.0.1:6401> keys *1) "names"2) "name"3) "zname"4) "sname2"5) "age"6) "customer:3"7) "customer:2"8) "n"9) "names2"
10) "sname"
11) "customer:1"
12) "sname3"
13) "bit"
127.0.0.1:6401> expire n 100
(integer) 1
127.0.0.1:6401>
- 查看key的过期时间
TTL key
127.0.0.1:6401> ttl n
(integer) 22
127.0.0.1:6401> ttl names
(integer) -1
127.0.0.1:6401> ttl aaaa
(integer) -2
127.0.0.1:6401>
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以秒为单位,返回 key 的剩余生存时间。
- 将key的有效期设为永不过期
PERSIST key
127.0.0.1:6401> keys *1) "names"2) "name"3) "zname"4) "sname2"5) "age"6) "customer:3"7) "customer:2"8) "names2"9) "sname"
10) "customer:1"
11) "sname3"
12) "bit"
127.0.0.1:6401> expire bit 100
(integer) 1
127.0.0.1:6401> ttl bit
(integer) 83
127.0.0.1:6401> persist bit
(integer) 1
127.0.0.1:6401> ttl bit
(integer) -1
127.0.0.1:6401>
- 更改key的名字
RENAME key newkey
127.0.0.1:6401> keys *n*
1) "names"
2) "name"
3) "zname"
4) "sname2"
5) "names2"
6) "sname"
7) "sname3"
127.0.0.1:6401> rename sname3 sname4
OK
127.0.0.1:6401> keys *n*
1) "names"
2) "name"
3) "zname"
4) "sname2"
5) "sname4"
6) "names2"
7) "sname"
127.0.0.1:6401>
jedis基本使用
jedis工具类
package com.pc.mystore.utils;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** Redis的工具类* * @author Switch* @data 2016年11月4日* @version V1.0*/
public class JedisUtils {private static JedisPool jedisPool = null;private static JedisPoolConfig poolConfig = null;static {// 静态块初始化Jedis连接池// 连接池配置信息poolConfig = new JedisPoolConfig();// 配置最大连接时poolConfig.setMaxTotal(20);// 配置最大空闲连接数poolConfig.setMaxIdle(2);try {// 获取配置文件InputStream inputStream = JedisUtils.class.getClassLoader().getResourceAsStream("jedis-config.properties");Properties props = new Properties();props.load(inputStream);// 获取主机名String host = props.getProperty("host");// 获取端口号Integer port = Integer.valueOf(props.getProperty("port"));jedisPool = new JedisPool(poolConfig, host, port);} catch (IOException e) {throw new RuntimeException(e);}}/*** 获得Redis连接* * @return jedis对象*/public static Jedis getJedis() {return jedisPool.getResource();}/*** 释放Redis连接回连接池* * @param jedis* jedis对象*/public static void release(Jedis jedis) {jedis.close();}public static void main(String[] args) {Jedis jedis = getJedis();jedis.set("name", "Switch");System.out.println(jedis.get("name"));}
}
配置文件:jedis-config.properties
# jedis配置文件
host=192.168.128.130
port=6379
jedis使用案例
CategoryServiceInter categoryService = new CategoryServiceImpl();public String findCategories(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取缓存中的商品分类信息Jedis jedis = JedisUtils.getJedis();String categoryList = jedis.get("categoryList");// 如果缓存中没有,则去数据库中查询,再设置到Redis中,释放连接if (categoryList == null) {categoryList = categoryService.findCategoriesAjax();jedis.set("categoryList", categoryList);}// 释放Jedis连接JedisUtils.release(jedis);// 返回ajax格式商品分类信息response.getWriter().write(categoryList);return null;
}
——参考《Redis命令参考》
——参考《Redis设计与实现》