Redis

基础

  • Redis 是一个开源免费的 key-value 数据库。性能高,丰富的数据类型,所有操作都是原子性的,还支持 publish/subscribe, 通知, key 过期等等特性。

特点

  • 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • 提供 list,set,zset,hash 等数据结构的存储。
  • 支持数据的备份,即 master-slave 模式的数据备份。

场景

Top 5 Redis Use Cases

  1. Session Cache
  2. Full Page Cache (FPC)
  3. Queues
  4. Leaderboards/Counting
  5. Pub/Sub

Install

brew install redis
# To have launchd start memcached at login:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
# Then to load memcached now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

# Best way is `brew services`
brew services start redis

# Start Redis server via “launchctl”.
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
# Start Redis server using configuration file.
redis-server /usr/local/etc/redis.conf
# Stop Redis on autostart on computer start.
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
# Location of Redis configuration file.
/usr/local/etc/redis.conf
# Get Redis package information.
brew info redis
# Test if Redis server is running. If it replies “PONG”, then it’s good to go!
redis-cli ping

配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。你可以通过 CONFIG 命令查看或设置配置项。各配置项的说明可以参考Redis 配置

需要注意的是 Redis 默认不是以守护进程的方式运行,可以通过该配置项修改。

Redis 命令

redis-cli
redis-cli -h host -p port -a password
INFO # 获取 redis 服务器的统计信息
PING # 查看服务是否运行
QUIT # 关闭当前连接
SELECT index # 切换到指定的数据库
SET w3ckey redis
DEL w3ckey

DEL 是一个命令,w3ckey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0

Redis 数据类型

Redis 支持五种数据类型:string,hash,list,set,zset

String

  • redis 最基本的类型,可以理解成与 Memcached 一样的类型,一个 key 对应一个 value。
  • 二进制安全的,可以包含任何数据。比如:jpg图片或者序列化的对象。
  • 一个键最大能存储 512MB。
SET w3ckey redis
GET w3ckey

Hash

  • 键值对集合,是 string 类型的 field 和 value 的映射表
  • 特别适合用于存储对象
HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
HGETALL w3ckey

List

  • 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
LPUSH w3ckey redis
LPUSH w3ckey mongodb
LRANGE w3ckey 0 10

Set

  • Set 是 string 类型的无序集合
  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
SADD w3ckey redis
SADD w3ckey mongodb
SADD w3ckey redis
SMEMBERS w3ckey

zset

  • zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员。
  • 不同的是每个元素都会关联一个 double 类型的分数。redis 通过分数来为集合中的成员进行从小到大的排序。
  • zset 的成员是唯一的,但分数 score 却可以重复。
ZADD w3ckey 1 redis
ZADD w3ckey 2 mongodb
ZADD w3ckey 3 mysql
ZADD w3ckey 3 mysql
ZRANGE w3ckey 0 10 WITHSCORES

HyperLogLog

  • HyperLogLog 是用来做基数统计的算法,在数学上,基数是集合论中刻画任意集合大小的一个概念。
  • HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
  • 因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
PFADD w3ckey "redis"
PFADD w3ckey "mongodb"
PFADD w3ckey "mysql"
PFCOUNT w3ckey

高级

发布订阅

创建了订阅频道名为 redisChat:

SUBSCRIBE redisChat

新打开一个 redis 客户端,在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

PUBLISH redisChat "Redis is a great caching technique"
PUBLISH redisChat "Learn redis by w3cschool.cc"

事务

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。
  • 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:开始事务 -> 命令入队 -> 执行事务。

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

MULTI
SET book-name "Mastering C++ in 21 days"
GET book-name
SADD tag "C++" "Programming" "Mastering Series"
SMEMBERS tag
EXEC

管道技术

通常情况下一个请求会遵循以下步骤:

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

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

管道技术最显著的优势是提高了 Redis 服务的性能。

Redis 的 Ruby 客户端,支持管道技术特性。

其它

参考

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Jun 13, 2017

奉献爱心