Redis学习

319 阅读5分钟

redis

概述

Redis 是运行速度很快的nosql内存键值数据库,可以存储键和五种类型的值之间的映射。

安装

brew install redis

数据类型

主要的数据类型有:

  • string : 字符串、整数或者浮点数 ,对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数自增或者自减操作。 api set/get setnx :设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,nx 是 not exist 的意思。

setex:设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。

127.0.0.1:6379> setex key 10 5
OK
127.0.0.1:6379> get key
"5"
127.0.0.1:6379> get key
(nil)

setrange:设置指定 key 的 value 值的子字符串。

mset:一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置。

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> set 1
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> get key
"1"
127.0.0.1:6379>

数据结构

struct sdshdr {
 long len;
 long free;
 char buf[];
};
  • list:列表,从两端压入或者弹出元素 对单个或者多个元素进行修剪, 只保留一个范围内的元素,底层数据结构:

  • set:无序集合,添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集 从集合里面随机获取元素,底层数据结构:

  • hash:包含键值对的无序散列表,添加/获取/移除单个健值对获取所有键值对检查某个健是否存在,底层数据结构。

  • zset:有序集合,添加、获取、删除元素 根据分值范围或者成员来获取元素 计算一个键的排名,底层数据结构:

api使用

string: SET SETNX SETEX PSETEX 参考:redisdoc.com/

数据结构

redis 提供上面所叙述的list代码,下面来学习一下redis的底层数据结构

  • hashmap
  • 跳表

使用场景

  • 计数器 redis 这种内存型的数据库,很适合存储频繁读写的计数数据。 比如某个字符串被访问了多少次。

  • 缓存 缓存是redis用得最多的地方,一般对于写少读多的数据都需要缓存来加快数据读取,提升系统性能。将热点数据放到内存中,提高数据使用效率。 我用go语言写了一个利用redis做缓存的示例代码:地址

  • 查找表 查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。例如DNS记录就很适合用redis来存储。

  • 消息队列 List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息 我这里也写了一个示例代码,帮助我们理解redis作为消息队列的使用。

  • 会话缓存 可以使用 Redis 来统一存储多台应用服务器的会话信息。

当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。

  • 分布式锁实现 在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。

可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 实例:

  • 其他 ZSet 可以实现有序性操作,从而实现排行榜等功能。 示例:

内存管理机制

过期时间

redis 可以为每个key设置过期时间,当key过期时,就会自动删除该key。 对于散列表这种容器,只能为整个键设置过期时间(整个散列表),而不能为键里面的单个元素设置过期时间。

数据淘汰

可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。

持久化

RDB 持久化: 将某个时间点的所有数据都存放到硬盘上。 可以将快照复制到其它服务器从而创建具有相同数据的服务器副本。 如果系统发生故障,将会丢失最后一次创建快照之后的数据。 如果数据量很大,保存快照的时间会很长。 AOF持久化: 将写命令添加到 AOF 文件(Append Only File)的末尾。

使用 AOF 持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项:

  • always:每个写命令都同步
  • everysec:每秒同步一次
  • no:让操作系统来决定何时同步

主从复制

配置:

事务

一个事务包含了多个命令,服务器在执行事务期间,不会改去执行其它客户端的命令请求。

事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。

Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec
1) (integer) 11
2) (integer) 12
3) "12"
127.0.0.1:6379> get age
"12"
127.0.0.1:6379>
  • 乐观锁复杂事务控制