1. 程式人生 > >Redis基礎知識小結

Redis基礎知識小結

wire one 瀏覽量 ida 運行 runt 實時性 final odi

Redis是一個高性能的key-value型數據庫。Redis能讀的速度是110000次/s,寫的速度是81000次/s ,性能極高。Redis的所有操作都是原子性的,意思就是要麽成功執行要麽失敗完全不執行。單個操作是原子性的,多個操作支持事務。

Redis是運行在內存中的,因此速度極快,由於數據是在內存中,關機後數據將丟失,但是redis是支持數據持久化的,將數據保存到磁盤中,重啟的時候可以再次加載進行使用。

1.Redis使用場景:

數據實時性要求高,數據存儲有過期和淘汰特征的,不需要保證弱一致性,邏輯簡單的場景。

具體如下:

(1)緩存

緩存現在幾乎是所有中大型網站都在用的必殺技,合理的利用緩存不僅能夠提升網站訪問速度,還能大大降低數據庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在緩存的場合非常多。

(2)排行榜

很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合數據類型能實現各種復雜的排行榜應用。

(3)計數器

什麽是計數器,如電商網站商品的瀏覽量、視頻網站視頻的播放數等。為了保證數據實時效,每次瀏覽都得給+1,並發量高時如果每次都請求數據庫操作無疑是種挑戰和壓力。Redis提供的incr命令來實現計數器功能,內存操作,性能非常好,非常適用於這些計數場景。

(4)分布式會話

集群模式下,在應用不多的情況下一般使用容器自帶的session復制功能就能滿足,當應用增多相對復雜的系統中,一般都會搭建以Redis等內存數據庫為中心的session服務,session不再由容器管理,而是由session服務及內存數據庫管理。

(5)分布式鎖

在很多互聯網公司中都使用了分布式技術,分布式技術帶來的技術挑戰是對同一個資源的並發訪問,如全局ID、減庫存、秒殺等場景,並發量不大的場景可以使用數據庫的悲觀鎖、樂觀鎖來實現,但在並發量高的場合中,利用數據庫鎖來控制資源的並發訪問是不太

理想的,大大影響了數據庫的性能。可以利用Redis的setnx功能來編寫分布式的鎖,如果設置返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。

2.Redis數據類型

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

3.在Java中使用Redis

Jedis是在java中用來操作Redis的工具。

下載驅動包jedis.jar,並將該驅動包包含在classpath下,同時需具備java環境和redis環境。

applicationContext.xml中添加 :

     <!-- 讀取配置文件信息 -->
      <context:property-placeholder location="classpath:redis.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>
  
     <!-- Jedis 連接池配置 -->
     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
          <property name="maxTotal" value="${redis.pool.maxTotal}"/>
          <property name="maxIdle" value="${redis.pool.maxIdle}"/>
          <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
          <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
     </bean>
 
     <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
         <constructor-arg ref="jedisPoolConfig"/>
         <constructor-arg value="${jedis.host}" type="java.lang.String"/>
         <constructor-arg type="int" value="${jedis.port}"/>
     </bean>

redis.properties:

# 控制一個pool可分配多少個jedis實例
redis.pool.maxTotal=1000
# 控制一個pool最多有多少個狀態為idle(空閑)的jedis實例
redis.pool.maxIdle=200
# 表示當borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋出JedisConnectionException
redis.pool.maxWaitMillis=2000
#在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的
redis.pool.testOnBorrow=true
# redis 單機
# 單機 host
jedis.host=127.0.0.1
# 單機 port
jedis.port=6379

java類:

@Autowired
    private JedisPool jedisPool;

    public Jedis getJedis() {
        Jedis jedis = this.jedisPool.getResource();
        // 使用index為2的database
        jedis.select(2);
        return jedis;
    }

    public void set(String key, String value, int seconds) {
        Jedis jedis = null;
        try {
            jedis = getJedis();
            jedis.setex(key, seconds, value);
            Long exp = jedis.ttl(key);
            if (exp < 0) {
                throw new RuntimeException("data time out!");19             }
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
            throw new TokenException(e.getMessage());
        } finally {
            if(jedis != null){jedis.close;}
        }
    }

Redis基礎知識小結