分布式Redis缓存串讲(一)
互联网应用的基石
现在流量稍微大些的网站,都会采取Redis。基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋。既然Redis这么重要,我们从它的官方介绍来完整的了解下它的能力,知己知彼,才能更运用自如。
现在流量稍微大些的网站,都会采取Redis。基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋。既然Redis这么重要,我们从它的官方介绍来完整的了解下它的能力,知己知彼,才能更运用自如。
Redis官方介绍
Redis是一个开源(BSD协议),内存解构存储,可以用作数据库,缓存和消息代理。它支持诸如字符串(strings),哈希散列(hashs),列表(lists),集合(sets),带有范围查询的排序集(sorted sets with range queries),位图(bitmaps),超级日志(hyperloglogs )和带有半径查询的地理空间索引(geospatial indexes with radius queries),Redis具有内置复制( replication),Lua脚本(Lua scripting),LRU驱逐(LRU eviction),事务(transactions )和不同级别的磁盘持久性(different levels of on-disk persistence),并通过Redis Sentinel提供高可用性和通过Redis Cluster自动分区。 您可以 对这些类型运行原子操作,例如附加到字符串 ; 递增哈希值 ; 将元素推送到列表中 ; 计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。 你可以对这些类型执行原子操作,像追加字符串;在哈希里递增值;推送一个元素到列表;计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。为了实现其出色的性能,Redis使用 内存数据集。根据您的使用情况,您可以通过 每隔一段时间将数据集转储到磁盘或通过将每个命令附加到日志来保留它。如果您只需要功能丰富的网络内存缓存,则可以选择禁用持久性。
Redis还支持简单到设置的主从异步复制,具有非常快速的非阻塞第一次同步,自动重新连接以及在网络分割上的部分重新同步。
其他功能包括:
- 事务
- 发布/订阅
- Lua脚本(例如:eval 调用redis的脚本)
- 设置Key的过期时间
- LRU-Cahce(内存管理的一种页面置换算法,最近最少使用)
- 自动故障转移(通过Redis Sentinel实现)
Redis是用ANSI C编写,官方建议使用Linux进行部署,Windows版本没有官方支持,但Microsoft开发并维护了Redis的Win-64端口。
Redis是一个开源(BSD协议),内存解构存储,可以用作数据库,缓存和消息代理。它支持诸如字符串(strings),哈希散列(hashs),列表(lists),集合(sets),带有范围查询的排序集(sorted sets with range queries),位图(bitmaps),超级日志(hyperloglogs )和带有半径查询的地理空间索引(geospatial indexes with radius queries),Redis具有内置复制( replication),Lua脚本(Lua scripting),LRU驱逐(LRU eviction),事务(transactions )和不同级别的磁盘持久性(different levels of on-disk persistence),并通过Redis Sentinel提供高可用性和通过Redis Cluster自动分区。 您可以 对这些类型运行原子操作,例如附加到字符串 ; 递增哈希值 ; 将元素推送到列表中 ; 计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。 你可以对这些类型执行原子操作,像追加字符串;在哈希里递增值;推送一个元素到列表;计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。为了实现其出色的性能,Redis使用 内存数据集。根据您的使用情况,您可以通过 每隔一段时间将数据集转储到磁盘或通过将每个命令附加到日志来保留它。如果您只需要功能丰富的网络内存缓存,则可以选择禁用持久性。
Redis还支持简单到设置的主从异步复制,具有非常快速的非阻塞第一次同步,自动重新连接以及在网络分割上的部分重新同步。
其他功能包括:
- 事务
- 发布/订阅
- Lua脚本(例如:eval 调用redis的脚本)
- 设置Key的过期时间
- LRU-Cahce(内存管理的一种页面置换算法,最近最少使用)
- 自动故障转移(通过Redis Sentinel实现)
Redis是用ANSI C编写,官方建议使用Linux进行部署,Windows版本没有官方支持,但Microsoft开发并维护了Redis的Win-64端口。
Redis应用场景
- 数据表缓存
一般访问量较大的表,读取时可以先获取Redis缓存,获取不到再查询数据库,然后放入Redis。这是最常见的运用场景。
- 业务状态缓存
例如,多租户的系统,为了减小批量数据压力,可以利用redis实现同一时间内,只能由一个导入。导入完成,清空缓存。也可以限制十分钟内只能导入一次等。
还有例如首页数据放入缓存,两分钟更新一次。
- 原子性
利用Redis一些原子性命令Inc,decr,可以实现业务参数唯一执行的场景,如订单付款成功通知,为了防止业务线创建多条记录,可以对订单Id执行inc命令,判断是否为1,1代表只有一个执行,如果大于1,则返回结果,并调用decr。类似于信号量。
- 数据表缓存
一般访问量较大的表,读取时可以先获取Redis缓存,获取不到再查询数据库,然后放入Redis。这是最常见的运用场景。
- 业务状态缓存
例如,多租户的系统,为了减小批量数据压力,可以利用redis实现同一时间内,只能由一个导入。导入完成,清空缓存。也可以限制十分钟内只能导入一次等。
还有例如首页数据放入缓存,两分钟更新一次。
- 原子性
利用Redis一些原子性命令Inc,decr,可以实现业务参数唯一执行的场景,如订单付款成功通知,为了防止业务线创建多条记录,可以对订单Id执行inc命令,判断是否为1,1代表只有一个执行,如果大于1,则返回结果,并调用decr。类似于信号量。
Redis应用风险
虽然Redis给我们提供了巨大的便利,但也要时刻保持对它的关注。要不然有些时候,会对你造成巨大的伤害。
- 缓存穿透
意思是指同一个key,数据库没有数据,巨大流量下,会不断的访问数据库。这是浪费的,可以针对一些场景,控制查询次数。如果获取不到值,在指定的时间内不再请求数据库。
- 缓存雪崩
同一时间内大量key同时失效,造成流量集体访问数据库,临时失去了缓存的作用。
- 缓存预热
必要的基础数据,可以提前缓存掉。节约第一次加载时间。
- 风险监控
针对线上机器的不同维度实施监控,如链接数,内存,cpu,稳定性等有异常及时发通知。
- flushall风险预知
在极端情况下,为了保证新业务的稳定,可能采取被迫措施flushall,清空所有缓存。这种情况下,你一定不能把缓存当成数据库来使用,要有缓存随时可以丢弃的自觉性。谨记!
虽然有大量要注意的风险点,但比起它的收益来讲,我们肯定会继续使用的。量一大,各种问题都会出来,不要怕,挺住!
虽然Redis给我们提供了巨大的便利,但也要时刻保持对它的关注。要不然有些时候,会对你造成巨大的伤害。
- 缓存穿透
意思是指同一个key,数据库没有数据,巨大流量下,会不断的访问数据库。这是浪费的,可以针对一些场景,控制查询次数。如果获取不到值,在指定的时间内不再请求数据库。
- 缓存雪崩
同一时间内大量key同时失效,造成流量集体访问数据库,临时失去了缓存的作用。
- 缓存预热
必要的基础数据,可以提前缓存掉。节约第一次加载时间。
- 风险监控
针对线上机器的不同维度实施监控,如链接数,内存,cpu,稳定性等有异常及时发通知。
- flushall风险预知
在极端情况下,为了保证新业务的稳定,可能采取被迫措施flushall,清空所有缓存。这种情况下,你一定不能把缓存当成数据库来使用,要有缓存随时可以丢弃的自觉性。谨记!
虽然有大量要注意的风险点,但比起它的收益来讲,我们肯定会继续使用的。量一大,各种问题都会出来,不要怕,挺住!
Redis C#客户端
C#客户端 这里列举了
- csredis
- Nhiredis
- redis-sharp
- redisboost
- ServiceStack.Redis
- Sider
- StackExchange.Redis
- TeamDev Redis Client
使用之前,可以先了解下它们的优点和弊端,如ServiceStack.Redis 4.0以上版本属于收费版本。StackExchange.Redis在.net core下有超时bug。
C#客户端 这里列举了
- csredis
- Nhiredis
- redis-sharp
- redisboost
- ServiceStack.Redis
- Sider
- StackExchange.Redis
- TeamDev Redis Client
使用之前,可以先了解下它们的优点和弊端,如ServiceStack.Redis 4.0以上版本属于收费版本。StackExchange.Redis在.net core下有超时bug。
Redis常用命令知悉
Redis官方提供了在线命令测试redis命令,我们可以通过这个网页快速熟悉命令。 命令种类有很多,我们今天先从strings,lists来熟悉下。
Redis官方提供了在线命令测试redis命令,我们可以通过这个网页快速熟悉命令。 命令种类有很多,我们今天先从strings,lists来熟悉下。
string下的命令
- set
- get
- getrange 获取字符串区间
- append 追加
> set key1 dolll
OK
> get key1
"dolll"
> GETRANGE key1 0 2
"dol"
> append key1 as
7
> get key1
"dolllas"
- incr 递增
- decr 递减
> incr hello
(integer) 1
> incr hello
(integer) 2
> decr hello
(integer) 1
- set
- get
- getrange 获取字符串区间
- append 追加
> set key1 dolll
OK
> get key1
"dolll"
> GETRANGE key1 0 2
"dol"
> append key1 as
7
> get key1
"dolllas"
- incr 递增
- decr 递减
> incr hello
(integer) 1
> incr hello
(integer) 2
> decr hello
(integer) 1
list下的命令
- lpush
- lrange
> lpush dwe redis
(integer) 1
> lpush dwe ds
(integer) 2
> lpush dwe sd
(integer) 3
> lpush dwe qd
(integer) 4
> lRange dwe 0 20
1) "qd"
2) "sd"
3) "ds"
4) "redis"
- lpush
- lrange
> lpush dwe redis
(integer) 1
> lpush dwe ds
(integer) 2
> lpush dwe sd
(integer) 3
> lpush dwe qd
(integer) 4
> lRange dwe 0 20
1) "qd"
2) "sd"
3) "ds"
4) "redis"
匆忙的结束
今天主要重温了下Redis,了解Redis应用场景,C#客户端和简单的运行命令。