Redis


Redis

一. 簡介

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

下載地址:https://github.com/microsoftarchive/redis/releases

二. Redis的優勢

:Redis非常快,每秒可執行大約110000次的設置(SET)操作,每秒大約可執行81000次的讀取/獲取(GET)操作。

支持豐富的數據類型:Redis支持開發人員常用的大多數數據類型,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。

操作的原子性:所有Redis操作都是原子操作,這確保如果兩個客戶端並發訪問,Redis服務器能接收更新的值。

很多使用工具:Redis是一個多實用工具,可用於多種用例,如:緩存,消息隊列(Redis本地支持發布/訂閱),應用程序中的任何短期數據,例如,web應用程序中的會話,網頁命中計數等。

三. 數據類型

A. 字符串類型 (字符串的值,最大長度為512M)

B. 散列類型(Hash) (map)

C. 列表類型(List) (列表的最大長度為2^32 -1個元素,大概40億)

D. 集合類型(Set)

E. 有序集合類型(zset)

四. 常用數據類型的操作

keys * : 獲取數據庫的所有的鍵。

exists key: 判斷某個鍵是否存在,返回表示存在,0表示部存在。

type key: 獲取鍵的類型(string,hash,list,set,zset)

4.1 字符串的常用操作

set key value: 設置或者覆蓋值。
incr key : 將對應的鍵的值,遞增1.
decr key : 將對應的鍵的值,遞減1.
get key: 根據鍵取值。
del key [key1, key2,,]: 刪除某個鍵。
expire key 時間(秒):設置key的存活時間,單位為秒。  
ttl code: 查看存活時間。 (TTL Time To Live)

4.2 列表的操作

lpush key value: 往左側中設置值。
rpush key value: 往右側插入值。
lrange start end: 取集合中索引在[start, end]之間的值。
例:lrange aa 0 2   lrange aa 0 -1
llen key: 獲取集合的長度。
lpop key: 移除並返回首元素。
rpop key: 移除並返回尾元素。
lrem key count value: 移除列表中count個值為value的數據。當count為0,移除所有。(了解)
ltrim key start end: 保留指定區域的元素,其他全部刪除。
lset key index value: 設置索引為index的值為value.
lindex key index: 獲取索引為index的元素。

4.3 集合的操作

sadd key member [memerb..]: 往集合中添加元素,返回添加成功的個數。
smembers key: 返回集合中所有的元素。
srem key member: 刪除元素。
sismember key member: 判斷member是否存在, 存在返回1,不存在返回0。
scard key: 返回集合中的個數。
srandmember key: 從集合中隨機返回一個值。
spop key: 移除並返回一個隨機的member.
smove src destination member: 將一個元素移動到另外一個集合中。
sinter key key: 對集合求交集。
sunion key key: 對兩個集合求並集。
sdiffstore destination key1 key2: 差集運算並存儲到集合中。
sinterstore destination key1 key2: 交集存儲到集合中。
sunionstore destionation key1 key2: 並集存儲到集合中。

4.4 Hash操作

hset key field value: 設置值, 如果存在相同的Key,對應的值會覆蓋之前的。
hmset key field value filed value: 設置多個值。
hget key field: 取值。
hexists key field: 是否存在。
hgetall key: 獲取集合中所有的元素。
hdel key field: 刪除字段。
hkeys key: 獲取所有的key。
hvals key: 獲取所有的字段值。
hlen key: 獲取字段的數量。
hsetnx key field value : 不存在的時候設置值。

4.5 有序集合

zadd key score value [score1 value1]: 添加。
zscore key value: 獲取分數。
zrange key start end: 獲取索引從start開始,到end結束的所有的元素。
zrange key start end withscores: 查詢索引從start開始,到end結束的所有元素名和分數。
zcard key: 獲取元素的個數。
zcount key min max: 獲取在指定分數范圍內的元素的個數。閉區間[min, max]
zrem key value1 [value2]: 刪除元素。
zrank key value: 返回value在key中的下標。
zrangebyscore key begin end: 查詢分數在[begin,end]區間的所有值,根據分數排序。
zrangebyscore key min max limit index length; (分頁)***********
zrevrange key 2 3: 倒序排列,然后去取下標在[2, 3]區間的元素。
zremrangebyscore key min max: 移除分數在[min,max]之間的數據,返回移除的個數。
zremrangebyrank key begin end: 移除索引在[begin,end]之間的數據。

五. Redis配置

redis的核心配置文件為redis的解壓目錄下名為redis.windows-service.conf的模板文件,拷貝一份重命名為redis.conf文件。

5.1 安全登錄

5.2 數據的持久化

5.3 主從備份(災備)(Master-Slave)

六. Redis 持久化之RDB和AOF

Redis 有兩種持久化方案,RDB(Redis DataBase)和 AOF (Append Only File).

6.1 RDB存儲

RDB 是 Redis 默認的持久化方案。在指定的時間間隔內,執行指定次數的寫操作,則會將內存中的數據寫入到磁盤中。即在指定目錄下生成一個dump.rdb文件。Redis 重啟會通過加載dump.rdb文件恢復數據。在5.2小結已經涉及到該存儲的方式。

6.2 AOF存儲

Redis 默認不開啟。它的出現是為了彌補RDB的不足(數據的不一致性),所以它采用日志的形式來記錄每個寫操作,並追加到文件中。Redis 重啟的會根據日志文件的內容將寫指令從前到后執行一次以完成數據的恢復工作。

6.3 總結

  1. Redis 默認開啟RDB持久化方式,在指定的時間間隔內,執行指定次數的寫操作,則將內存中的數據寫入到磁盤中。

  2. RDB 持久化適合大規模的數據恢復,但它的數據一致性和完整性較差。

  3. Redis 需要手動開啟AOF持久化方式,默認是每秒將寫操作日志追加到AOF文件中。

  4. AOF 的數據完整性比RDB高,但記錄內容多了,會影響數據恢復的效率。

  5. Redis 針對 AOF文件大的問題,提供重寫的瘦身機制。

  6. 若只打算用Redis 做緩存,可以關閉持久化。

  7. 若打算使用Redis 的持久化。建議RDB和AOF都開啟。其實RDB更適合做數據的備份,留一后手。AOF出問題了,還有RDB。

七. Linux中Redis的安裝

Linux版Redis的下載地址為:https://redis.io/download

將Redis放入到Linux操作系統中,然后解壓,進入到redis-5.0.5目錄下:

執行 make 命令

make

如果在使用make命令的時候出現如上的錯誤,執行以下命令:

apt install gcc automake autoconf libtool make

再次執行 make 命令即可,如果出現錯誤,可以使用 如下命令:

make MALLOC=libc

啟動Redis, 進入到src目錄下,執行如下命令:

./redis-server

八. Redis集群

A. 在redis的解壓目錄下新建rediscluster文件夾,將redis的解壓目錄下的redis.conf文件拷貝到rediscluster目錄下,將該文件復制六份,名字分別為:

  • redis-6379.conf

  • redis-6380.conf

  • redis-6381.conf

  • redis-6382.conf

  • redis-6383.conf

  • redis-6384.conf

B. 以redis-6379.conf文件為例,修改其中的內容,修改部分內容如下:

port 6379
cluster-enabled yes
cluster-config-file /redis/nodes/nodes-6379.conf #文件夾需要創建
cluster-node-timeout 15000

C. 分別啟動六個redis服務,命令如下:

src/redis-server ../rediscluster/redis-6379.conf &
src/redis-server ../rediscluster/redis-6380.conf &
src/redis-server ../rediscluster/redis-6381.conf &
src/redis-server ../rediscluster/redis-6382.conf &
src/redis-server ../rediscluster/redis-6383.conf &
src/redis-server ../rediscluster/redis-6384.conf &

D. 配置集群,進入到redis的src目錄下,執行如下命令:

./redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

E. shell腳本啟動,腳本內容如下:

#!/bin/bash
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6379.conf > /dev/null &` &&
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6380.conf > /dev/null &` &&
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6381.conf > /dev/null &` &&
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6382.conf > /dev/null &` &&
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6383.conf > /dev/null &` &&
`/redis/redis-5.0.5/src/redis-server /redis/rediscluster/redis-6384.conf > /dev/null &`

sleep 3s

`/redis/redis-5.0.5/src/redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1 > /dev/null &`

九. redis與spring boot整合

依賴配置:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
   <version>2.7.0</version>
</dependency>

代碼中直接注入 RedisTemplate即可使用。

十. Mybatis二級緩存

10.1 緩存類的實現

要想使用Mybatis的二級緩存,必須要實現Cache接口,具體的實現如下:

public class RedisCache implements Cache {

   private RedisTemplate<Object, Object> redisTemplate;

   private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

   private String id;

   public RedisCache(){}

   public RedisCache(String id) {
       this.id = id;
  }

   private RedisTemplate<Object, Object> getRedisTemplate() {
       if(null == this.redisTemplate) {
           this.redisTemplate = (RedisTemplate)ApplicationContextHolder.getBean("redisTemplate");
      }
       return this.redisTemplate;
  }

   @Override
   public String getId() {
       return this.id;
  }

   @Override
   public void putObject(Object key, Object value) {
       if(value != null) {
           this.getRedisTemplate().opsForValue().set(key, value);
      }
  }

   @Override
   public Object getObject(Object key) {
       if(null != key) {
           return this.getRedisTemplate().opsForValue().get(key);
      }
       return null;
  }

   @Override
   public Object removeObject(Object key) {
       if(null != key) {
           this.getRedisTemplate().delete(key);
      }
       return null;
  }

   @Override
   public void clear() {
       Set<Object> set = getRedisTemplate().keys("*:" + this.id + "*");
       if(null != set) {
           getRedisTemplate().delete(set);
      }
  }

   @Override
   public int getSize() {
       return 0;
  }

   @Override
   public ReadWriteLock getReadWriteLock() {
       return this.readWriteLock;
  }
}

10.2 獲取ApplicationContext

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
   private static ApplicationContext applicationContext;

   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
       this.applicationContext = applicationContext;
  }

   public static ApplicationContext getApplicationContext() {
       return applicationContext;
  }

   public static Object getBean(String name) {
       return getApplicationContext().getBean(name);
  }
   public static <T> T getBean(Class<T> clazz) {
       return getApplicationContext().getBean(clazz);
  }
   public static <T> T getBean(String name, Class<T> clazz) {
       return getApplicationContext().getBean(name, clazz);
  }
}

10.3 mapper.xml配置

<!--
      flushInterval: 清空緩存的時間間隔,單位為毫秒; 默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用更新語句時刷新。
      size: 可以被設置為任意正整數, 緩存的數量,默認是1024;
      evication: LRU 移除最長時間不被使用的對象。
      blocking: 默認是false;
    -->
<cache size="1024" type="com.qf.cache.RedisCache" />

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM