七的博客

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"