Redis概述

Redis是一个内存中数据结构(Key-Value)存储系统。它可以用作数据库、缓存和消息中间件。

Redis支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。

Redis内置了复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

Redis特点

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Q: 在java应用程序中,为什么不直接保存到HashMap中?

  1. Redis可以在多语言系统中使用。
  2. Redis可以在分布式系统使用。
  3. Redis支持数据的持久化,服务器重启之后数据不会丢。
  4. Redis其他特性方便了使用,比如过期时间、操作的原子性、消息队列、事务、数据备份等等。
    在以上4点的基础上Redis还是高可用、高性能的存储系统。

Redis适用场景

Redis的适用场景的是由它的特点所决定的。

  1. Redis数据结构相关
    1. 队列(lists)
      使用Redis list相关的集合。
    2. 显示最近的条目列表(lists)
      比如显示文章或商品最近的10条评论。使用关系数据库时,我们可能会用下面的sql频繁的查询数据库。

       SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10
      

      而如果使用redis,我们可以在每次发表新评论后,将评论的ID保存到redis的list中:

       LPUSH latest.comments <ID>
      

      然后每次只需要从内存获取最新的10条记录:

       LTRIM latest.comments 0 9
       LRANGE latest.comments 0 9
      
    3. 统计特定时间内的特定项目的数据(sets)
      对于其他数据库,我们可能要专门创建一张表,这张表可能会有这么几个字段:项目id创建时间想要统计的数据。而使用redis一条命令就可以保存:

       SADD page:day1:<page_id> <user_id>
      

      查询时只需要使用set相关的命令就可以了。例如:

       SCARD page:day1:<page_id>
       SISMEMBER page:day1:<page_id>
      
    4. 排序相关(sorted sets)
      Redis的有序集合可以快速的对记录排序。
  2. 其他命令
    1. 用作计数器
      相关命令:
       INCR key
       INCRBY key increment
       DECR key
       DECRBY key decrement
      
    2. 位操作
      相关命令:
       SETBIT key offset value
       GETBIT key offset
       BITCOUNT key [start] [end
      
  3. 其它特性
    1. 保存临时数据
      比如登录需要的验证码,验证码在校验之后或一段时间之后就应该被删除。
    2. 消息队列Pub/Sub
    3. 用作分布式锁
  4. 缓存

Redis使用

特性

在Java中使用Redis

Github实践

spring-data-redis

Github实践

参考资料