bboyjing's blog

Redis学习笔记一【初识Redis】

最近又想写一个Redis学习笔记系列,顺便巩固下平时积累的零碎知识,参考书籍《Redis in action》中文版。关于Redis的简介就不赘述了,本系列还是着重于工程化地去使用它。

安装环境

  • 电脑环境:Ubuntu 16.04
  • JDK:1.8
  • Redis:redis-3.2.4

直接在官网下载最新版的压缩包,当前最新版为3.2.4,本系列所有的测试都将基于该版本,将下载的压缩包拷贝到想安装的目录即可。

1
2
3
4
5
6
7
8
sudo tar -zxvf ~/Downloads/redis-3.2.4.tar.gz -C /opt
#更改下redis安装目录权限
sudo chmod -R 777 /opt/redis-3.2.4
cd /opt/redis-3.2.4
#编译,生成redis-server等可执行文件
make
#启动redis服务
src/redis-server

Redis数据结构

Redis可以存储5种数据结构,分别为:STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。下面大致列举下这几种结构的特性:

结构类型 结构存储的值
STRING 可以是字符串、整数或者浮点数
LIST 一个链表,链表上的每个节点都包含了一个字符串
SET 包含字符串的无序收集器,且值不重复
HASH 包含键值对的无序散列
ZSET 有序集合,元素的排列顺序由分值的大小决定

下面使用redis-cli客户端简单地测试下这五种数据结构

STRING

1
2
3
4
5
6
7
8
9
10
11
#启动客户端
/opt/redis-3.2.4/src/redis-cli
#将键first-key的值设为hello
127.0.0.1:6379> set string-key hello
OK
#获取键first-key的值
127.0.0.1:6379> get string-key
"hello"
#删除first-key,返回受影响的记录的条数
127.0.0.1:6379> del string-key
(integer) 1

LIST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#启动客户端
/opt/redis-3.2.4/src/redis-cli
#向列表末端推入新元素,返回值为列表的长度
127.0.0.1:6379> rpush list-key item1
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
#获取列表给定范围的所有值,-1表示整个列表的结束
127.0.0.1:6379> lrange list-key 0 -1
1) "item1"
2) "item2"
#获取指定位置的单个元素,元素依然存在列表中
127.0.0.1:6379> lindex list-key 1
"item2"
#弹出列表最左侧元素,返回值为该元素,并且被弹出的元素将不再存在于列表中
127.0.0.1:6379> lpop list-key
"item1"
#以下输出表明被弹出的item1已经不存在于列表中
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"

SET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#启动客户端
/opt/redis-3.2.4/src/redis-cli
#添加新元素
127.0.0.1:6379> sadd set-key item1
(integer) 1
#添加一个set中已经包含的元素,从返回值已经可以看出没有添加到set中
127.0.0.1:6379> sadd set-key item1
(integer) 0
127.0.0.1:6379> sadd set-key item2
(integer) 1
#查看set中所有的元素,可以看出item1没有重复
127.0.0.1:6379> smembers set-key
1) "item2"
2) "item1"
#查看某个元素是否存在,0表示不存在、1表示存在
127.0.0.1:6379> sismember set-key item3
(integer) 0
127.0.0.1:6379> sismember set-key item1
(integer) 1
#移除set中的元素,返回移除元素的数量
127.0.0.1:6379> srem set-key item1
(integer) 1
#只剩item2表示移除成功
127.0.0.1:6379> smembers set-key
1) "item2"

HASH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#启动客户端
/opt/redis-3.2.4/src/redis-cli
#散列中添加键值对
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
#列出散列中所有的键和值
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
#hset返回值表示键是否已经存在与散列中
127.0.0.1:6379> hset hash-key sub-key1 new_value
(integer) 0
#可以看出sub-key1的值更新了
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "new_value"
3) "sub-key2"
4) "value2"
#获取散列中指定的键的值
127.0.0.1:6379> hget hash-key sub-key1
"new_value"
#删除散列中指定的键
127.0.0.1:6379> hdel hash-key sub-key1
(integer) 1
#(nil)表示sub-key1已经不存在,删除成功
127.0.0.1:6379> hget hash-key sub-key1
(nil)

ZSET

有序集合和散列一样,都用于存储键值对:有序集合的键北川为成员(member),每个成员都是各不相同的;而有序集合的值被称为分值(score)。有序集合时Redis里唯一一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的数据结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#启动客户端
/opt/redis-3.2.4/src/redis-cli
#向有序集合中添加元素
127.0.0.1:6379> zadd zset-key 985 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 211 member1
(integer) 1
#获取给定范围的有序集合成员以及分值,分值为211的元素是后加的排在前面
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "211"
3) "member0"
4) "985"
#可以获取指定分值范围的元素
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "211"
#删除有序集合中的元素
127.0.0.1:6379> zrem zset-key member1
(integer) 1
#只剩member0,表示删除成功
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "985"

本章大致了解了下Redis中的集中数据结构,每种数据结构的操作命令并没有列全,更多丰富的命令后面会再涉及到,这一章就到此结束。