Redis学习笔记(二)

一、Redis 数据类型

Redis 支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)以及 zset(有序集合)

1、string(字符串)

  string 是 Redis 最基本的数据类型,可以理解成与 Memcached 一样的类型,一个 key 对应一个 value

  string 是二进制安全的。意思是 redis 的 string 可以包含任何数据,包括 jpg 图片或者序列化的对象。

  string 一个键最大能储存 512MB。

例子:

127.0.0.1:6379> set var "String type"
OK
127.0.0.1:6379> get var
"String type"

说明:利用 set 给变量 var 赋值“String type”;再利用 get 获得变量 var 的值

 

2、Hash(哈希)

  Hash 是一个键值对集合

  Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

hset & hget 例子:

127.0.0.1:6379> hget set1 name
"myhash"
127.0.0.1:6379> hget set1 score
"100"
127.0.0.1:6379> hset set2 name myhash2
(integer) 1
127.0.0.1:6379> hset set2 score 110
(integer) 1
127.0.0.1:6379> hget set1 name 
"myhash"

hset&hget 一次只能往哈希结构里面插入一个键值对,如果插入多个可以用 hmset&hmget。

hmset&hmget 例子:

127.0.0.1:6379> HMSET var:1  name jihite school pku
OK

127.0.0.1:6379> HGETALL var:1
1) "name"
2) "jihite"
3) "school"
4) "pku"

说明:

  var:1 是键值,每个 hash 可以存储 232 - 1 键值对(40 多亿)。

  Hmset 用于建立 hash 对象,hgetAll 用于获取 hash 对象

 

hset vs hmset 操作对比:

127.0.0.1:6379> hset set5 name1 jihite1 name2 jihite2 name3 jihite3
(error) ERR wrong number of arguments for 'hset' command
127.0.0.1:6379> hmset set5 name1 jihite1 name2 jihite2 name3 jihite3
OK
127.0.0.1:6379> hget set5 name1
"jihite1"
127.0.0.1:6379> hmget set5 name1
1) "jihite1"
127.0.0.1:6379> hmget set5 name1 name2
1) "jihite1"
2) "jihite2"
127.0.0.1:6379> hget set5 name1 name2
(error) ERR wrong number of arguments for 'hget' command

 

 

3、LIST(列表)

例子

127.0.0.1:6379> lpush lvar 1
(integer) 1
127.0.0.1:6379> lpush lvar a
(integer) 2
127.0.0.1:6379> lpush lvar ab
(integer) 3

127.0.0.1:6379> lrange lvar 0 1
1) "ab"
2) "a"
127.0.0.1:6379> lrange lvar 0 10
1) "ab"
2) "a"
3) "1"
127.0.0.1:6379> lrange lvar 2 2
1) "1"

说明:

  lpush 往列表的前边插入,lrange 后面的数字是范围(闭区间)

  列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储 40 多亿)。

 

4、Set(集合)

Redis 的 set 是 string 类型的无序集合

集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是 O(1)

例子:

127.0.0.1:6379> sadd setvar redis
(integer) 1
127.0.0.1:6379> sadd setvar mongodb
(integer) 1
127.0.0.1:6379> sadd setvar mongodb
(integer) 0
127.0.0.1:6379> sadd setvar rabbitmq
(integer) 1
127.0.0.1:6379> smembers setvar
1) "rabbitmq"
2) "redis"
3) "mongodb"

说明:

  set 往集合中插入元素,smembers 列举出集合的元素

  成功插入返回 1;错误插入返回 0,例子中 mongdb 第二次插入时,因为已经存在,故插入失败。

 

5、zset(有序集合)

zset 和 set 一样也是 String 类型的集合,且不允许元素重复

zset 和 set 不同的地方在于 zset 关联一个 double 类型的分数,redis 通过分数对集合中的元素排序。

zset 的元素是唯一的,但是分数是可以重复的。

例子:

127.0.0.1:6379> zadd zvar 1 redis
(integer) 1
127.0.0.1:6379> zadd zvar 1 redis
(integer) 0
127.0.0.1:6379> zadd zvar 2 redis
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> zadd zvar 2 mongo
(integer) 1
127.0.0.1:6379> zadd zvar 0 rabbitmq
(integer) 1
127.0.0.1:6379>  
127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000
1) "rabbitmq"
2) "mongo"
3) "redis"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> zadd zvar -2 celery
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000
1) "rabbitmq"
2) "mongo"
3) "redis"
127.0.0.1:6379> ZRANGEBYSCORE zvar -3 1000
1) "celery"
2) "rabbitmq"
3) "mongo"
4) "redis"

说明:

  成功插入返回 1,插入失败返回 0. 插入已存在的元素失败,返回 0.

  分数为 float(可正、负、0)

 

二、Redis HyperLogLog

  Redis HyperLogLog 是用来做技术统计的算法。优点是在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

  在 Redis 里面,每个 HyperLogLog 键只需要花费 12kB 内存,就可以计算接近 2^64 个不同元素的基数。这河计算基数时,元素越多耗费内存就越多的集合形式形成鲜明对比。

  注意:因为 HyperLogLog 只会根据输入元素来计算基数,而不会存储输入元素本身,因此不会返回输入的各个元素。基数是什么?对于 ['abc','abc','2','3'],基数是 ['abc','2','3'],个数是 3

例子:

localhost:6379> pfadd jsh redis
(integer) 1
localhost:6379> pfadd jsh redis
(integer) 0
localhost:6379> pfadd jsh mongodb
(integer) 1
localhost:6379> pfadd jsh rabbitmq
(integer) 1
localhost:6379> pfcount jsh
(integer) 3
localhost:6379> pfadd jsh2 redis
(integer) 1
localhost:6379> pfadd jsh2 a
(integer) 1
localhost:6379> pfcount jsh2
(integer) 2

localhost:6379> pfmerge jsh jsh2
OK
localhost:
6379> pfcount jsh
(integer)
4
localhost:
6379> pfcount jsh2
(integer)
2

说明:

  pfadd key ele [ele2 ...]: 添加指定元素到 HyperLogLog 中,

  pfcount key: 返回给定 HyperLogLog 的基数估算值

  pfmerge destkey srckey [srckey2 ...]: 讲多个 HyperLogLog 合并到一个第一个 HyperLogLog 中。

 

三、Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

原理:下图展示了三个客户端 client1、client2、client5 订阅了频道 channel1

当有新消息通过 PUBLISH 发送给 channel1 时,这时候 channel1 就会把消息同时发布给订阅者

 

例子,创建订阅频道 redisChat:

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

打开客户端,订阅 channel redisChat

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

然后 channel redisChat 发送消息“hello world”

localhost:6379> publish redisChat "Hello World"
(integer) 1

客户端会收到消息

Reading messages... (press Ctrl-C to quit)
1) "pmessage"
2) "redisChat"
3) "redisChat"
4) "Hello World"

 

 

四、Redis 事务

事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),操作一个事务中的命令时不会被其他命令打断。

一个事务从开始到结束经过以下三个阶段:

  开始事务 》 命令入队 》 执行事务

例子:

localhost:6379> MULTI
OK
localhost:6379> set name jihite
QUEUED
localhost:6379> get name
QUEUED
localhost:6379> sadd language "c++" "python" "java"
QUEUED
localhost:6379> smembers language
QUEUED
localhost:6379> exec
1) OK
2) "jihite"
3)(integer) 3
4) 1) "java"
   2) "python"
   3) "c++"

说明:事务以 MULTI 开始,以 EXEC 结束

 

五、Redis 脚本

Redis 脚本使用 Lua 解释器来执行脚本。执行脚本的常用命令为 EVAL。基本语法:

EVAL script numkeys key [key ...] arg [arg ...]

例子

localhost:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"