redis之应用场景

  • 1、配合关系型数据库做高速缓存
  • 1.1、热点数据缓存
  • 1.2、会话缓存( Session Cache)
  • 1.3、全页缓存( FPC)
  • 2、多样的数据结构存储持久化数据
  • 2.1、最新N个数据
  • 2.2、排行榜 topN
  • 2.3、时效性数据(验证码等)
  • 2.4、计数器、秒杀
  • 2.5、去除大量数据中的重复数据
  • 2.6、队列
  • 2.7、发布/订阅 消息系统
  • 3、Redis 中 List 常用操作
  • 4、Redis 中 Sorted Set 常用操作


1、配合关系型数据库做高速缓存

1.1、热点数据缓存

查询热点数据缓存。

1.2、会话缓存( Session Cache)

用Redis 缓存会话比其他存储(如Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失, 大部分人都会不高兴的, 现在,他们还会这样吗? 幸运的是,随着Redis 这些年的改进,很容易找到怎么恰当的使用Redis 来缓存会话的文档。甚至广为人知的商业平台Magento 也提供Redis 的插件。

1.3、全页缓存( FPC)

除基本的会话token 之外,Redis 还提供很简便的FPC 平台。回到一致性问题,即使重启了Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP 本地FPC。再次以Magento 为例,Magento提供一个插件来使用Redis 作为全页缓存后端。此外,对WordPress 的用户来说,Pantheon 有一个非常好的插件wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

2、多样的数据结构存储持久化数据

2.1、最新N个数据

通过List实现按自然时间排序的数据。

2.2、排行榜 topN

利用zset(有序集合);Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以, 我们要从排序集合中获取到排名最靠前的10个用户– 我们称之为“ user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一个很好的例子,用Ruby 实现的, 它的排行榜就是使用Redis 来存储数据的,你可以在这里看到。

2.3、时效性数据(验证码等)

expire过期性质

2.4、计数器、秒杀

原子性,自增方法incrdecr

2.5、去除大量数据中的重复数据

利用set集合

2.6、队列

Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。如果你快速的在Google中搜索“ Redis queues”,你马上就能找到大量的开源项目, 这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如, Celery 有一个后台就是使用Redis 作为broker,你可以从这里去查看。

2.7、发布/订阅 消息系统

Redis 提供发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis 的发布/订阅功能来建立聊天系统!

3、Redis 中 List 常用操作

在 Redis 中,List 是一种常用的数据类型,它可以像 Java 中的数组一样,保存一组有序的数据。Redis 中的 List 支持从两端进行元素的插入和删除操作,非常适合在消息队列、栈、队列等场景中使用。下面是 Redis 中 List 常用的一些操作:

  1. LPUSH:将元素添加到 List 的左侧
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
  1. RPUSH:将元素添加到 List 的右侧
redis> RPUSH mylist "hello"
(integer) 1
redis> RPUSH mylist "world"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
  1. LPOP:从 List 的左侧弹出元素
redis> LPOP mylist
"hello"
redis> LRANGE mylist 0 -1
1) "world"
  1. RPOP:从 List 的右侧弹出元素
redis> RPOP mylist
"world"
redis> LRANGE mylist 0 -1
(empty list or set)
  1. LINDEX:获取 List 中指定位置的元素
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LINDEX mylist 0
"hello"
redis> LINDEX mylist 1
"world"
  1. LTRIM:修剪 List,只保留指定区间内的元素
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LPUSH mylist "foo"
(integer) 3
redis> LPUSH mylist "bar"
(integer) 4
redis> LRANGE mylist 0 -1
1) "bar"
2) "foo"
3) "hello"
4) "world"
redis> LTRIM mylist 1 2
OK
redis> LRANGE mylist 0 -1
1) "foo"
2) "hello"
  1. LLEN:获取 List 的长度(即包含元素的个数)
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LLEN mylist
(integer) 2
  1. LRANGE:获取 List 中指定区间范围内的元素
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LPUSH mylist "foo"
(integer) 3
redis> LPUSH mylist "bar"
(integer) 4
redis> LRANGE mylist 1 3
1) "foo"
2) "hello"
3) "world"

通过上面这些操作,可以方便地使用 Redis 的 List,实现各种队列、栈等数据结构。另外,List 在 Redis 中还被广泛用于实现简单的消息队列、任务队列等场景,可以实现消息的生产、消费等功能。

4、Redis 中 Sorted Set 常用操作

在 Redis 中,有序集合(Sorted Set)是一种基于哈希表和跳跃表(Skip List)实现的数据结构,它类似于 Set,但每个元素都会关联一个分值,因此元素的插入、删除和查找都支持按照分值进行有序操作。有序集合在实现排行榜、任务调度等场景中非常有用。下面是 Redis 中 Sorted Set 常用的一些操作:

  1. ZADD:添加元素到有序集合中
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
  1. ZRANGE:获取有序集合中指定范围的元素
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
redis> ZRANGE myzset 1 3
1) "two"
2) "three"
3) "four"
  1. ZREM:从有序集合中移除指定元素
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1
1) "one"
2) "three"
3) "four"
  1. ZSCORE:获取指定元素的分值
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZSCORE myzset "three"
"3"
  1. ZCARD:获取有序集合中元素的数量
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZCARD myzset
(integer) 4
  1. ZCOUNT:获取有序集合中指定分值范围内的元素数量
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZCOUNT myzset 2 3
(integer) 2
  1. ZRANK:获取有序集合中指定元素的排名(排行)
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three" 4 "four"
(integer) 2
redis> ZRANK myzset "three"
(integer) 2

通过上面这些操作,可以方便地使用 Redis 的 Sorted Set,实现各种排行榜、任务调度等功能。其中,ZADD、ZREM、ZRANK 等操作常用于实现排名系统和任务调度系统,ZRANGE、ZSCORE、ZCOUNT 常用