Redis 快速上手

整合SQL必知必会的redis部分,方便快速熟悉redis,具体命令操作见官方文档

Redis特点

  • 高性能的key/value数据库
  • 基于内存
  • 数据类型丰富
  • 持久化
  • 单线程
  • 订阅/发布模型

对比memcached

  • 不仅支持简单k/v类型数据,还提供list、set、hash等数据结构存储
  • 支持数据的主从复制
  • 支持数据的持久化,可以将内存中的数据保存到磁盘,重启的时候再次加载原有数据
  • 单个value最新限制1GB,memcached智能保存1MB的数据

应用场景

  • 集群环境下的session管理
  • 充当web缓存
  • 充当消息队列

redis部署

# 手动安装
下载 redis-*.tar.gz

# tar zxf redis-*.tar.gz
# cd redis-*.tar.gz
# make PREFIX=/usr/local/redis install
# mkdir /usr/local/redis/etc
# cp redis.conf /usr/local/redis/etc/

启动
1. /usr/local/redis/bin/server
1. /usr/local/redis/bin/server /usr/local/redis/etc/redis.conf

# 自动安装的话,一行命令即可

管理命令

save 将数据同步保存在磁盘
bgsave 将数据异步保存到磁盘
lastsave 返回上次成功将数据保存到磁盘的UNIX时间戳
shutdown 将数据同步保存到磁盘,然后关闭服务

info 提供服务器的信息和统计
monitor 实时转储收单的请求
slaveof 改变复制策略设置
config 在运行时配置服务器

quit 关闭连接
auth 简单密码认证

数据类型及操作

  • string 字符串
  • hash 键值都为字符串的哈希表
  • list 字符串列表
  • set 无序不重复的字符串集合
  • zset 有序…
字符串类型是 Redis 提供的最基本的数据类型,对应的结构是 key-value。
set key value
get key

哈希(hash)提供了字段和字段值的映射,对应的结构是 key-field-value。
hset user1 username zhangfei
hset user1 age 28
Hmset user1 username zhangfei age 28

hget key field
hget user1 username

hmget key field[field...]
hmget user1 username age

字符串列表(list)的底层是一个双向链表结构,所以我们可以向列表的两端添加元素,时间复杂度都为 O(1),同时我们也可以获取列表中的某个片段。
向列表左侧增加元素可以使用:LPUSH key value [...]
LPUSH heroList zhangfei guanyu liubei

RPUSH key value [...]向列表右侧添加元素
RPUSH heroList dianwei lvbu

想要获取列表中某一片段的内容,使用LRANGE key start stop
LRANGE heroList 0 4

字符串集合(set)是字符串类型的无序集合,与列表(list)的区别在于集合中的元素是无序的,同时元素不能重复。
在集合中添加元素,可以使用SADD key member [...]
SADD heroSet zhangfei guanyu liubei dianwei lvbu

在集合中删除某元素,可以使用SREM key member [...]
SREM heroSet liubei lvbu

获取集合中所有的元素,可以使用SMEMBERS key
SMEMBERS heroSet

判断集合中是否存在某个元素,可以使用SISMEMBER key member
SISMEMBER heroSet zhangfei
SISMEMBER heroSet liubei

我们可以把有序字符串集合(SortedSet,简称 ZSET)理解成集合的升级版。
实际上 ZSET 是在集合的基础上增加了一个分数属性,这个属性在添加修改元素的时候可以被指定。
每次指定后,ZSET 都会按照分数来进行自动排序,也就是说我们在给集合 key 添加 member 的时候,可以指定 score。

在有序集合中添加元素和分数,使用ZADD key score member [...]
ZADD heroScore 8341 zhangfei 7107 guanyu 6900 liubei 7516 dianwei 7344 lvbu

获取某个元素的分数,可以使用ZSCORE key member

ZREM heroScore gu获取某个范围的元素列表。
如果想要分数从小到大进行排序,使用ZRANGE key start stop [WITHSCORES],
如果分数从大到小进行排序,使用ZREVRANGE key start stop [WITHSCORES]。
需要注意的是,WITHSCORES 是个可选项,如果使用 WITHSCORES 会将分数一同显示出来anyu

ZREVRANGE heroScore 0 2 WITHSCORES

除了这 5 种数据类型以外,Redis 还支持位图(Bitmaps)数据结构,
在 2.8 版本之后,增加了基数统计(HyperLogLog),
3.2 版本之后加入了地理空间(Geospatial)以及索引半径查询的功能,
在 5.0 版本引用了数据流(Streams)数据类型。

Redis 的事务处理机制

Redis 的事务处理与 RDBMS 的事务有一些不同。

首先 Redis 不支持事务的回滚机制(Rollback),这也就意味着当事务发生了错误(只要不是语法错误),
整个事务依然会继续执行下去,直到事务队列中所有命令都执行完毕。
在Redis 官方文档中说明了为什么 Redis 不支持事务回滚。

只有当编程语法错误的时候,Redis 命令执行才会失败。这种错误通常出现在开发环境中,而很少出现在生产环境中,没有必要开发事务回滚功能。

另外,Redis 是内存数据库,与基于文件的 RDBMS 不同,通常只进行内存计算和操作,无法保证持久性。
不过 Redis 也提供了两种持久化的模式,分别是 RDB 和 AOF 模式。

RDB(Redis DataBase)持久化可以把当前进程的数据生成快照保存到磁盘上,触发 RDB 持久化的方式分为手动触发和自动触发。
因为持久化操作与命令操作不是同步进行的,所以无法保证事务的持久性。

AOF(Append Only File)持久化采用日志的形式记录每个写操作,弥补了 RDB 在数据一致性上的不足,
但是采用 AOF 模式,就意味着每条执行命令都需要写入文件中,会大大降低 Redis 的访问性能。
启用 AOF 模式需要手动开启,有 3 种不同的配置方式,默认为 everysec,也就是每秒钟同步一次。
其次还有 always 和 no 模式,分别代表只要有数据发生修改就会写入 AOF 文件,以及由操作系统决定什么时候记录到 AOF 文件中。

虽然 Redis 提供了两种持久化的机制,但是作为内存数据库,持久性并不是它的擅长。
Redis 是单线程程序,在事务执行时不会中断事务,其他客户端提交的各种操作都无法执行,
因此可以理解为 Redis 的事务处理是串行化的方式,总是具有隔离性的。

Redis 的事务处理的命令

MULTI:开启一个事务;
EXEC:事务执行,将一次性执行事务内的所有命令;
DISCARD:取消事务;
WATCH:监视一个或多个键,如果事务执行前某个键发生了改动,那么事务也会被打断;
UNWATCH:取消 WATCH 命令对所有键的监视。

需要说明的是 Redis 实现事务是基于 COMMAND 队列,
如果 Redis 没有开启事务,那么任何的 COMMAND 都会立即执行并返回结果。
如果 Redis 开启了事务,COMMAND 命令会放到队列中,并且返回排队的状态 QUEUED,
只有调用 EXEC,才会执行 COMMAND 队列中的命令。

玩家排行榜案例

统计全部玩家的排行榜
ZREVRANGE user_score 0 -1 WITHSCORES

按名次查询排名前 N 名的玩家
统计前 10 名玩家,可以使用:ZREVRANGE user_score 0 9

查询某个玩家的分数
查询玩家 10001 的分数可以使用:ZSCORE user_score 10001

查询某个玩家的排名
查询玩家 10001 的排名可以使用:ZREVRANK user_score 10001

对玩家的分数和排名进行更新
对玩家 10001 的分数减 1,可以使用:ZINCRBY user_score -1 10001

查询指定玩家前后 M 名的玩家
查询玩家 10001 前后 5 名玩家都是谁,当前已知玩家 10001 的排名是 18036,
那么可以使用:ZREVRANGE user_score 18031 18041

增加或移除某个玩家,并对排名进行更新
删除玩家 10001,可以使用:ZREM user_score 10001
查询下排名在 1803118041 的玩家是谁,使用:ZREVRANGE user_score 18031 18041

把玩家 10001 的信息再增加回来,使用:ZADD user_score 93.1504697596 10001
看下排名在 1803118041 的玩家是谁,使用:ZREVRANGE user_score 18031 18041
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!