Redis3.0的安装以及使用
Redis3.0的安装以及使用
最近在学习一个项目的时候,接触了 Redis 这个软件来实现缓存。 对学习 Redis 的过程稍微做个记录总结。
Redis 是一个高性能的内存数据库,它可以提供很高性能的数据存储跟数据访问能力。用 Redis 比较常见的场景是把 Redis 当做一个缓存来使用。
编程语言里面也有很多可以实现缓存的工具类,这些工具类实现的缓存有下面几点缺点:
- 比如你使用 Java 语言的 HashMap 实现一个数据缓存,那么这个数据只会存储在应用进程的内存里面,不可以跨多个应用共享这部分缓存。
- 数据如果保存在内存里面,重启后数据就会丢失。
但是 Redis 用来实现缓存就不一样,它可以解决上面的问题:
Redis 是一个中间件,所以它可以被多个应用访问,数据可以共享。
Redis 的数据可以持久化到磁盘里面去,所以不会丢数据。
1. 安装 Redis
Redis 因为是用 C 语言写的,而且需要下载源码编译,所以要准备 C 语言的编译环境。
我这边本地操作系统是 Ubuntu 16 ,编译环境已经有了,所以编译起来倒也不是特别麻烦。
gcc 环境准备:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential tcl
下载 Redis 源码:
# 到一个合适的目前下载这个包
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
tar xzf redis-3.0.7.tar.gz
cd redis-3.0.7
编译源码:
make
安装:
sudo make install
拷贝配置 Redis 配置到 /etc 目录下:
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/
如果要让 Redis 支持后台运行的话,还需要改下配置文件里面的 daemonize no 变成 daemonize yes。 可以用下面的脚本实现:
sudo sed -i 's/daemonize no/daemonize yes/' /etc/redis/redis.conf
启动 Redis 服务:
redis-server /etc/redis/redis.conf
如果上面 redis-server 命令找不到的话,说明安装没有成功,重新安装下。
2. Redis 用法
首先验证下 Redis 服务启动是否成功
redis-cli
如果安装正确的话,会跳出下面的内容:
127.0.0.1:6379>
接着输入 PING 会出现下面的内容:
127.0.0.1:6379> PING
PONG
出现上面的内容说明 Redis 服务启动也连接正常。上面的命令是连接到默认的 localhost:6379 这个端口的 Redis上,如果不是连接本地的或者端口号不一样,可以调整下命令参数。
redis-cli -h RedisIp地址 -p 端口号
Redis 目前支持以下几种常用数据类型:
- 字符串类型(String): 最基本的数据类型,可以存储文本、数字等。
- 哈希类型(Hash):用于保存键值对集合,可以理解为就是一个哈希表,哈希表里面可以保存若干个键值对。
- 列表(List):有顺序并且元素可重复的列表。
- 集合(Set):没有顺序并且不可以重复的集合。
- 有序集合(Sorted Set): 有顺序并且不可以重复的集合。
上面几个数据类型跟这种通用的数据结构本质上差不太多,稍微理解下这个类型就可以很快的知道它的作用。
2.1 String 类型用法
String 类型是 Redis 中最基础的数据类型。它可以保存字符串,还可以保存数字。
甚至你还可以把各种复杂的对象通过序列化算法存到这个里面去。 比如你可以把一个复杂的对象序列化成 JSON 文本,存到 String 里面去。
- 使用 SET 命令设置一个值。
127.0.0.1:6379> SET key "value"
OK
- 使用 GET 命令获取一个值
127.0.0.1:6379> GET key
"value"
- 使用 INCR 命令让当前数值 + 1
127.0.0.1:6379> INCR test_number
(integer) 1
- 使用 DECR 命令让当前数值 - 1
127.0.0.1:6379> DECR test_number
(integer) 0
- 使用 INCRBY 命令加一个数值
127.0.0.1:6379> INCRBY test_number 1000
(integer) 1000
- 使用 DECRBY 命令减一个数值
127.0.0.1:6379> DECRBY test_number 555
(integer) 445
2.2 Hash 类型用法
Hash 类型就相当于一个 key 对应一个 map ,这个 map 里面可以包含多个键值对。
可以看下面这个 JSON 的例子,这个就有点类似于 hash 的结构:
{
"user:1000": {
"name": "admin",
"age": "35"
}
}
- 使用 HSET 命令设置字段值
127.0.0.1:6379> HSET user:1000 name "admin"
(integer) 1
127.0.0.1:6379> HSET user:1000 age "35"
(integer) 1
- 使用 HGET 命令获取某个字段的值
127.0.0.1:6379> HGET user:1000 name
"admin"
127.0.0.1:6379> HGET user:1000 age
"35"
- 使用 HGETALL 命令获取所有字段的值
127.0.0.1:6379> HGETALL user:1000
1) "name"
2) "admin"
3) "age"
4) "35"
2.3 List 类型用法
List 就是有顺序并且元素可重复的列表, 比较常用来实现消息队列。
- 使用 LPUSH 命令从队列左边插入元素
127.0.0.1:6379> LPUSH test_list "element1"
(integer) 1
127.0.0.1:6379> LPUSH test_list "element2"
(integer) 2
127.0.0.1:6379> LPUSH test_list "element3"
(integer) 3
- 使用 LPOP令从队列右边弹出元素
127.0.0.1:6379> RPOP test_list
"element1"
127.0.0.1:6379> RPOP test_list
"element2"
127.0.0.1:6379> RPOP test_list
"element3"
- 使用 LRANGE 获取列表中一批元素
127.0.0.1:6379> LPUSH test_list "element1"
(integer) 1
127.0.0.1:6379> LPUSH test_list "element2"
(integer) 2
127.0.0.1:6379> LPUSH test_list "element3"
(integer) 3
127.0.0.1:6379> LPUSH test_list "element4"
(integer) 4
127.0.0.1:6379> LPUSH test_list "element5"
(integer) 5
127.0.0.1:6379> LRANGE test_list 0 -1
1) "element5"
2) "element4"
3) "element3"
4) "element2"
5) "element1"
2.4 Set 类型用法
Set 就是没有顺序并且不可以重复的集合,跟各种编程语言里面的 Set 一样,无序并且不能重复。
- ADD 命令添加一个或者多个元素
127.0.0.1:6379> SADD myset "a" "b" "c"
(integer) 3
- SMEMBERS 令获取集合中所有的元素
127.0.0.1:6379> SMEMBERS myset
1) "c"
2) "b"
3) "a"
- SREM 命令删除集合中的元素
127.0.0.1:6379> SREM myset "b"
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "c"
2) "a"
- SISMEMBER 命令判断元素在集合中是否存在
127.0.0.1:6379> SISMEMBER myset "a"
(integer) 1
- SCARD 命令随机获取一个或者多个元素
127.0.0.1:6379> SRANDMEMBER myset 2
1) "c"
2) "a"
- 获取集合元素个数
127.0.0.1:6379> SCARD myset
(integer) 2
2.5 Sorted Set 类型用法
Sorted Set 跟 Set 的区别就在于,一个是有顺序的集合,一个是没有顺序的集合。
有顺序肯定是通过属性来实现的,Redis 中就是给集合中的元素绑定一个 score 来实现排序的。
简单总结下就是:
- 集合中的元素必须唯一,但是 score 可以一样。
- 元素的顺序是根据 score 来进行排序的,score 可以是整数或者浮点数。
下文中的 score 将会成为分数。
主要方法有:
- ZADD 添加元素,添加元素的命令参数比较复杂。
语法: ZADD key [NX|XX] [CH] [INCR] score member [score member …]
可以添加一个或多个元素到 Sorted Set,如果元素已存在则更新其分数。
NX:只添加新元素,不更新已存在的元素。
XX:只更新已存在的元素,不添加新元素。
CH:修改返回值为发生变化的元素数量。
INCR:对已存在元素的分数进行累加。
# 简单的添加单个元素
127.0.0.1:6379> ZADD myzset 12345 "key"
(integer) 1
# 简单的添加多个元素
127.0.0.1:6379> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
# 只添加新元素,不更新已存在的值。 这里的 six 会被添加,one 不会更新
127.0.0.1:6379> ZADD myzset NX 6 "six" 1 "one"
(integer) 1
# 只更新已经存在元素,不添加元素。 这里的 six 会更新成99,seven 不会被添加。
127.0.0.1:6379> ZADD myzset XX 7 "seven" 99 "six"
(integer) 0
- ZREM 移除元素
127.0.0.1:6379> ZREM myzset "two"
(integer) 1
- ZSCORE 获取元素的分数
127.0.0.1:6379> ZSCORE myzset "one"
"1"
- ZINCRBY 增加元素分数
127.0.0.1:6379> ZINCRBY myzset 100 "one"
"101"
- ZCARD 获取集合中的元素数量
127.0.0.1:6379> ZCARD myzset
(integer) 2
- ZCOUNT 获取指定分数范围内的元素数量
127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 1
127.0.0.1:6379> ZCOUNT myzset 1 102
(integer) 2
- ZRANGE 获取指定排名区间内的元素,分数从低到高排序。 ( ZREVRANGE 是反过来的,分数从高到低排序)
语法:ZRANGE key start stop [WITHSCORES]
- key:Sorted Set 的键名
- start:起始排名,默认从0开始,-1表示最后一个元素,-2表示倒数第二个元素,以此类推。
- stop:结束排名。
- WITHSCORES:可选参数。如果指定的话就会同时返回元素的分数。
start 和 stop 都是闭区间,即包含在内的
# 获取所有元素不带分数
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "two"
2) "three"
3) "one"
# 获取所有元素带分数
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"
5) "one"
6) "101"
# 获取前2名
127.0.0.1:6379> ZRANGE myzset 0 1
1) "two"
2) "three"
# 获取前3名
127.0.0.1:6379> ZRANGE myzset 0 2
1) "two"
2) "three"
3) "one"
# 获取最后2名
127.0.0.1:6379> ZRANGE myzset -2 -1
1) "three"
2) "one"
# 获取最后2名带分数
127.0.0.1:6379> ZRANGE myzset -2 -1 WITHSCORES
1) "three"
2) "3"
3) "one"
4) "101"