Redis入门教程

1.介绍

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

2.数据类型

  • String:字符串
  • Hash:哈希
  • List:列表
  • Set:集合
  • ZSet(Sorted Sets): 有序集合

3. 下载安装

最新版下载地址:http://redis.io/download
以下是在Ubuntu环境下进行安装

$ sudo apt-get update
$ sudo apt-get install redis-server
// 启动redis
$ redis-server 
// 连接redis
$ redis-cli
127.0.0.1:6039> ping
PONG

注: 配置文件位于 /etc/redis.conf

4. 基本操作

  1. String: 字符串
    Redis 最基本的数据类型,string 类型是二进制安全的,string可以是任何数据的序列化,最大能存储 512MB。
语法:
SET key value [EX seconds] [PX milliseconds] [NX|xx]
EX:  过期时间 秒
PX:  过期时间 毫秒
NX:  不过期
GET key : 获取
DEL key : 删除
实例:
127.0.0.1:6039> SET test "hello world"
OK

127.0.0.1:6379> GET test
"hello world"

127.0.0.1:6379> DEL test
(integer) 0

127.0.0.1:6379> GET test
(nil)
  1. Hash: 散列表
    Redis hash 是一组键值(key=>value)对集合。
    Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
语法:
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HDEL key filed [field ...] 
HLEN key:获取hash表的数量
HKEYS key: 获取hash表中所有的字段
HVALS key: 获取hash表中所有的值
HEXISTS key field:判断字段是否存在
实例:
127.0.0.1:6379> HSET myobj name "redis"
(integer) 0

127.0.0.1:6379> HGET myobj name
"redis"

127.0.0.1:6379> HMSET myobj name "redis1" message "hello world redis1" count 1
OK

1) "redis1"
2) "hello world redis1"
3) "1"

127.0.0.1:6379> HDEL myobj name count
(integer) 2

127.0.0.1:6379> HMGET myobj name message count
1) (nil)
2) "hello world redis1"
3) (nil)

127.0.0.1:6379> HLEN myobj
(integer) 2

127.0.0.1:6379> HKEYS myobj
1) "message"
2) "type"

127.0.0.1:6379> HVALS myobj
1) "hello world redis1"
2) "test"

127.0.0.1:6379> HGETALL myobj
1) "message"
2) "hello world redis1"
3) "type"
4) "test"

127.0.0.1:6379> HEXISTS myobj name
(integer) 0

127.0.0.1:6379> HEXISTS myobj message
(integer) 1
  1. List: 列表
    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
语法:
LPUSH key value [value ...]: 添加到头部
LPOP key : 从头部取数据
RPOP key : 从尾部取数据
RPUSH key value [value ...]: 添加到尾部
LRANGE key start stop: 读取
LLEN key: 读取list长度
实例:
127.0.0.1:6379> LPUSH list_left 1 2 3 5 7
(integer) 5

127.0.0.1:6379> LRANGE list_left 0 5
1) "7"
2) "5"
3) "3"
4) "2"
5) "1"

127.0.0.1:6379> LPOP list_left
"7"

127.0.0.1:6379> LRANGE list_left 0 4
1) "5"
2) "3"
3) "2"
4) "1"

127.0.0.1:6379> RPOP list_left
"1"

127.0.0.1:6379> LRANGE list_left 0 3
1) "5"
2) "3"
3) "2"

127.0.0.1:6379> LLEN list_left
(integer) 3

127.0.0.1:6379> RPUSH list_right 1 2 3 5 7
(integer) 5

127.0.0.1:6379> LRANGE list_right 0 5
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
  1. Set: 集合
    Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
语法:
SADD key value [value ...]: 添加
SMEMBERS key : 读取所有字段
SCARD key: 获取集合长度
SINTER key1 [key ...] : 获取集合的交集
SDIFF key1 [key ...]: 获取key1 与其他集合的差集
SREM key member [member ...] : 移除集合中的元素

实例:
127.0.0.1:6379> SADD set_test redis rabbitmq redis
(integer) 2

127.0.0.1:6379> SMEMBERS set_test
1) "redis"
2) "rabbitmq"

127.0.0.1:6379> SADD set_test ABB
(integer) 1

127.0.0.1:6379> SMEMBERS set_test
1) "redis"
2) "ABB"
3) "rabbitmq"

127.0.0.1:6379> SCARD set_test
(integer) 3

127.0.0.1:6379> SADD set_test1 redis rocketmq ABB
(integer) 3

127.0.0.1:6379> SINTER set_test set_test1
1) "redis"
2) "ABB"

127.0.0.1:6379> SDIFF set_test set_test1
1) "rabbitmq"

127.0.0.1:6379> SDIFF set_test1 set_test
1) "rocketmq"

127.0.0.1:6379> SREM set_test redis
(integer) 1

127.0.0.1:6379> SMEMBERS set_test
1) "ABB"
2) "rabbitmq"
  1. ZSet: 有序集合
    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    有序集合的成员是唯一的,但分数(score)却可以重复。
    当items内容大于64的时候同时使用了hash和skiplist两种设计实现,这是为排序和查找性能做的优化。
    这里的score可以认为是权重,可用来处理优先级的问题。
语法:
ZADD key score1 member1 [score2 member2 ...]
ZCARD key
ZCOUNT key min max
ZRANGE key start stop [WITHSCORES]
ZREM key member [member ...]
ZSCORE key member

实例:
127.0.0.1:6379> ZADD zset_test 1 redis 2 mysql 2 mongodb 3 rabbitmq
(integer) 4

127.0.0.1:6379> ZRANGE zset_test 0 4 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "2"
7) "rabbitmq"
8) "3"

127.0.0.1:6379> ZSCORE zset_test mysql
"2"

5. 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。


Redis pub/sub 示意图
1. 暂定channel的名称为 redisChat
2. 打开一个客户端,订阅redisChat

127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

# 订阅客户端收到的消息
1) "message"
2) "redisChat"
3) "Hello Redis"
1) "message"
2) "redisChat"
3) "Hello everyone, I am new"

3. 打开另外一个客户端,往redisChat这个channel上发布消息
127.0.0.1:6379> PUBLISH redisChat "Hello Redis"
(integer) 1

4. 再打开一个客户端,继续往redisChat这个channel上发布消息
127.0.0.1:6379> PUBLISH redisChat "Hello everyone, I am new"
(integer) 1

6. Redis事务

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的,目前仅是任务队列,队列中的某条指令失败,不会回滚 Transactions doc

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set m1 I
QUEUED
127.0.0.1:6379> SADD mset I am a new person
QUEUED
127.0.0.1:6379> get m1
QUEUED
127.0.0.1:6379> SMEMBERS mset
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 5
3) "I"
4) 1) "new"
   2) "a"
   3) "I"
   4) "am"
   5) "person"

7. 数据备份与恢复

语法:
CONFIG GET dir : 获取默认备份位置
SAVE: 当前数据库的备份
BGSAVE: 当前数据库的后台备份

127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/var/db/redis"

127.0.0.1:6379> keys *
1) "zset_test"
2) "m1"
3) "myobj"
4) "set_test"
5) "list_left"
6) "mset"
7) "list_test"
8) "list_right"
9) "set_test1"

127.0.0.1:6379> SAVE
OK

将会在redis安装目录下生成 dump.rdb,备份时只需要将该文件移动到 /usr/local/var/db/redis,重启服务即可。

注: 还有一种策略叫做 AOF,即将发送到Redis服务端的每一条命令都记录下来,并且保存到硬盘中的AOF文件中,类似打日志文件,来一条命令就记录一条。

RDB:

优点:适合备份,文件小,速度快(大量数据时)
缺点:每隔一段时间保存一次,所以当系统宕机时,可能会损失几分钟的数据

AOF:

优点:数据不会丢失
缺点:文件大,速度慢(大量数据时)

8. 安全

redis默认是免密,非常不安全,我们可以设置密码进行保护

语法:
CONFIG set requirepass "password"

实例:
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

127.0.0.1:6379> CONFIG set requirepass password
OK

127.0.0.1:6379> CONFIG get requirepass
(error) NOAUTH Authentication required.

127.0.0.1:6379> AUTH password
OK

// 或者重新登录或者 
➜  ~ redis-cli -a password
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "password"

9. 性能测试

语法:
redis-benchmark [option] [option value]

实例:
➜  ~ redis-benchmark -n 10000  -q
PING_INLINE: 84033.61 requests per second
PING_BULK: 85470.09 requests per second
SET: 85470.09 requests per second
GET: 85470.09 requests per second
INCR: 86956.52 requests per second
LPUSH: 86956.52 requests per second
RPUSH: 86956.52 requests per second
LPOP: 85470.09 requests per second
RPOP: 86206.90 requests per second
SADD: 86956.52 requests per second
SPOP: 87719.30 requests per second
LPUSH (needed to benchmark LRANGE): 86956.52 requests per second
LRANGE_100 (first 100 elements): 26737.97 requests per second
LRANGE_300 (first 300 elements): 11235.96 requests per second
LRANGE_500 (first 450 elements): 7824.73 requests per second
LRANGE_600 (first 600 elements): 5959.48 requests per second
MSET (10 keys): 81300.81 requests per second

10. 管道技术

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
  • 服务端处理命令,并将结果返回给客户端。

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应,极大的提高了Redis的性能。

➜  ~ (echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | redis-cli -a password

PONG
OK
"redis"
(integer) 4
(integer) 5
(integer) 6

注:参考runoob.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350