高性能缓存---Redis实操
Java客户端
Redssion
特点:操作最简单,功能最丰富,Redis智能客户端,支持分布式集合,分布式锁,三方框架整合等。底层采
用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。使用比其他redis客户端效率高。
https://github.com/redisson/redisson/
Jedis
特点: Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。与Spring集成。作为其
官方推荐的Java版客户端jedis也非常强大和稳定,支持事务、管道及有jedis自身实现的分布式。
https://github.com/xetorthio/jedis
Redis Desktop Manager
特点:C++ 编写,响应迅速,性能好。但不支持数据
库备份与恢复
https://github.com/uglide/RedisDesktopManager
Redis Client
特点:使用Java编写,功能丰富,缺点是性能稍差,
网络不好时,会不时断线。
https://github.com/caoxinyu/RedisClient
Redis Studio
特点:又一个C++编写的redis管理工具,仅支持
windows平台,支持xp操作系统
https://github.com/cinience/RedisStudio
Redis流量监控
CacheCloud (https://github.com/sohutv/cachecloud)
提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减少开发人员的运维成本和误操作,提高机器的利用率,提供灵活的伸缩性,提供方便的接入客户端
功能
1. 监控统计: 提供了机器、应用、实例下各个维度数据的监控和统计界面
2. 一键开启: Redis Standalone、Redis Sentinel、Redis Cluster三种类型的应用,无需手动配置初始化。
3. Failover: 支持哨兵,集群的高可用模式。
4. 伸缩: 提供完善的垂直和水平在线伸缩功能。
5. 完善运维: 提供自动运维和简化运维操作功能,避免纯手工运维出错。
6. 方便的客户端:方便快捷的客户端接入。
7. 元数据管理: 提供机器、应用、实例、用户信息管理。
8. 流程化: 提供申请,运维,伸缩,修改等完善的处理流程
Redis应用场景
会话缓存(Session Cache) 最常用的情景是会话缓存。用Redis缓存会话比其他存储(如Memcached)
的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部
丢失,大部分人都会不高兴的。
对象缓存 做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加
入缓存功能。Redis的高效缓存给我们解决了难题
分布式锁 在互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,分布式批处理。
Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。
队列 Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息
队列平台来使用。
排行榜/计数器 Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合
(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”
Redis行业应用
Twitter 使用 Redis 来储存用户时间线(user timeline)。
StackOverflow 使用 Redis 来进行缓存和消息分发。
Github 使用 Redis 作为持久化的键值对数据库,并使用 Resque 来实现消息队列。
新浪微博 使 用 Redis 来实现计数器 、 反向索引 、 排行榜 、 消 息 队 列 , 并 储 存 用 户 关 系 。
知乎 使用 Redis 来进行计数、缓存、消息分发和任务调度
Pinterest 使用 Redis 来构建关注模型(follow model)和兴趣图谱(interest graph)。
Flickr 使用 Redis 来构建队列。
Redis常用命令
(1)字符串
SET name "Tom"
GET name
SET counter 1000
INCR counter
DECR counter
APPEND name "Jack"
(2)散列类型
HMSET car name "volvo" color "black" price
20
HMGET car name
HEXISTS car name
HDEL car price
(3)列表类型
LPUSH lists redis
LPUSH lists mogodb
RPUSH lists mysql
LPOP lists
RPOP lists
LRANGE lists 0 10
(4)集合类型
SADD letters a
SADD letters a b c
SREM letters c d
SMEMBERS letters
SADD setA 1 2 3
SDIFF setA setB
(5)有序集合
ZADD tutorials 1 redis 2 mongodb 3 mysql 3 mysq
ZRANGE tutorials 0 10 WITHSCORES
(6)事务
MULTI
INCR likes
INCR visitors
EXEC
(7)生存时间
SET session uuid11
EXPIRE session 20
TTL session
(8)排序
LPUSH mylist 4 2 6 1 7 3
SORT mylist
LPUSH mylistalpha a c e d c a
SORT mylistalpha ALPHA
(9)消息通知
PUBLISH redisChat "Redis is a great caching technique"
SUBSCRIBE redisChat
PUBLISH redisChat "Learn redis by tutorials point"
持久化 —RDB
Redis提供了RDB、AOF持久化方式,将内存中的数据保存到磁盘中,避免数据意外丢失。
RDB(快照)通过将服务器某个时间点上的数据库状态(非空数据库以及相关键值对)保存到一个经过压缩的二进制文件中(dump.rdb),也是默认的持久化方式。
手动持久化命令:
SAVE 命令会阻塞Redis服务器进程。
BGSAVE 会派生出一个子进程,然后由子进程负责创建RDB文件,服务器父进程继续处理命令
请求。
持久化—AOF
AOF持久化
将“操作 + 数据”以格式化指令的方式追加到操作日志文件(appendonly.aof)的尾部,在append操作
返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操
作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。
AOF默认关闭,开启方法,修改配置文件reds.conf:appendonly yes
AOF文件同步策略,有三个合法值:always everysec no,默认为everysec
持久化—RDB与AOF比较
RDB
优点:RDB 是一个非常紧凑的文件,它保存了 Redis 在某个时间点上的数据集。这种文件非常适合用
于进行备份。
缺点:如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 允许你设置
不同的保存点(save point)来控制保存 RDB 文件的频率, 但是, 因为RDB 文件需要保存整个数据
集的状态,所以它并不是一个轻松的操作。因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种
情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
AOF
优点:使用 AOF 持久化会让 Redis 变得非常耐久:你可以设置不同的 fsync 策略,比如无 fsync ,每
秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配
置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据
( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。
缺点:对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。根据所使用的 fsync 策
略,AOF 的速度可能会慢于 RDB 。
简单事务
事务 (transaction) 是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中
的命令要么都执行,要么都不执行。Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开
始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再
发送 EXEC 命令表示事务命令结束。
消息发布/订阅
Redis提供了一组命令可以让开发者实现“发布/订阅” (publish/subscribe)模式。“发布/订阅”模式可以实现进程间的消息传递,“发布/订阅”模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道,发布者可以向指定的频道发送消息,所有订阅此频道的人都会收到此消息。
命令:
PUBLISH news.it “hello world” //发送消息
SUBSCRIBE news.it //订阅消息
Q&A
Redis所需内存 超过可用内存怎么办?
我们知道,redis设置配置文件的maxmemory参数,可以控制其最大可用内存大小(字节)。
那么当所需内存,超过maxmemory怎么办?
这个时候就该配置文件中的maxmemory-policy出场了。其默认值是noeviction。下面我将列出当可用
内存不足时,删除redis键具有的淘汰规则。
volatile-lru 使用LRU算法删除一个键(只对设置了生存时间的键)
allkeys-lru 使用LRU算法删除一个键
volatile-random 随机删除一个键(只对设置了生存时间的键)
allkeys-random 随机删除一个键
volatile-ttl 删除生存时间最近的一个键
noeviction 不删除键,只返回错误
LRU算法,least Recently Used,最近最少使用算法。也就是说默认删除最近最少使用的键。
但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,
删除这三个键中最近最少使用的键。
那么3这个数字也是可以设置的,对应位置是配置文件中的maxmemory-samples。