最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring框架接入單機(jī)Redis兩種實(shí)現(xiàn)方式解析

 更新時間:2020年09月27日 08:35:35   作者:愛笑的berg  
這篇文章主要介紹了Spring框架接入單機(jī)Redis兩種實(shí)現(xiàn)方式解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

1、Redis的簡單介紹

1)Redis 是一個開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。 它支持多種類型的數(shù)據(jù)結(jié)構(gòu),如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。Redis 內(nèi)置了 復(fù)制(replication),LUA腳本(Lua scripting), LRU驅(qū)動事件(LRU eviction),事務(wù)(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動 分區(qū)(Cluster)提供高可用性(high availability)。Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。

2)Redis的內(nèi)存管理機(jī)制:

在Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的。當(dāng)物理內(nèi)存用完時,Redis可以將一些很久沒用到的value交換到磁盤。Redis只會緩存所有的key的信息,如果Redis發(fā)現(xiàn)內(nèi)存的使用量超過了某一個閥值,將觸發(fā)swap的操作,Redis根據(jù)“swappability = age*log(size_in_memory)”計算出哪些key對應(yīng)的value需要swap到磁盤。然后再將這些key對應(yīng)的value持久化到磁盤中,同時在內(nèi)存中清除。這種特性使得Redis可以保持超過其機(jī)器本身內(nèi)存大小的數(shù)據(jù)。

3)Redis性能和集群管理:

Redis雖然支持?jǐn)?shù)據(jù)的持久化,但是全內(nèi)存畢竟才是其高性能的本質(zhì)。作為基于內(nèi)存的存儲系統(tǒng)來說,機(jī)器物理內(nèi)存的大小就是系統(tǒng)能夠容納的最大數(shù)據(jù)量。如果需要處理的數(shù)據(jù)量超過了單臺機(jī)器的物理內(nèi)存大小,就需要構(gòu)建分布式集群來擴(kuò)展存儲能力。Redis更偏向于在服務(wù)器端構(gòu)建分布式存儲。

4)Redis 同其他 key - value 緩存數(shù)據(jù)庫比較具有以下

  • Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進(jìn)行使用。
  • Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
  • Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

5)Redis優(yōu)勢

  • .性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • .豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
  • .原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
  • .豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
  • .Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進(jìn)行高速讀寫時需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點(diǎn)是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問。

2、spring框架中接入redis的兩種方式:

步驟1:引入相關(guān)依賴

<!--使用jedis 需要引入 commons-pool 的依賴,否則Jedis會實(shí)例化失敗-->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.7.1</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.5.6</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.6.2.RELEASE</version>
    </dependency>

    <!-- redis中 如果存儲的是Map<String,Object>需要導(dǎo)入jackson相關(guān)的包,存儲的時候使用json序列化器存儲。如果不導(dǎo)入jackson的包會報錯。 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.5.1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.5.1</version>
    </dependency>

步驟2:Redis相關(guān)屬性文件:redis.properties

#訪問地址
redis.host=127.0.0.1
#訪問端口
redis.port=6379
#注意,如果沒有password,此處不設(shè)置值,但這一項(xiàng)要保留
redis.password=@redisLearn

#最大空閑數(shù),數(shù)據(jù)庫連接的最大空閑時間。超過空閑時間,數(shù)據(jù)庫連接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無限制。
redis.maxIdle=300
#連接池的最大數(shù)據(jù)庫連接數(shù)。設(shè)為0表示無限制
redis.maxActive=600

#最大建立連接等待時間。如果超過此時間將接到異常。設(shè)為-1表示無限制。
redis.maxWait=1000

#在borrow一個jedis實(shí)例時,是否提前進(jìn)行alidate操作;如果為true,則得到的jedis實(shí)例均是可用的;
redis.testOnBorrow=true

#客戶端連接超時時間
redis.timeout=30000

#可用數(shù)據(jù)庫數(shù)
redis.database = 0

步驟3:Spring中引入Redis配置、及調(diào)用實(shí)例(方式1和方式2選擇其中一種進(jìn)行配置)

  方式1:通過spring-data-redis工具實(shí)現(xiàn)對Redis的操作 spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">

  <!-- 連接池基本參數(shù)配置,類似數(shù)據(jù)庫連接池 -->
  <context:property-placeholder location="classpath:conf/redis.properties" ignore-unresolvable="true" />

  <!-- redis連接池 -->
  <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="${redis.maxActive}" />
    <property name="maxIdle" value="${redis.maxIdle}" />
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
  </bean>

  <!-- 連接池配置,類似數(shù)據(jù)庫連接池 -->
  <bean id="jedisConnectionFactory"
     class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.host}"></property>
    <property name="port" value="${redis.port}"></property>
    <!-- <property name="password" value="${redis總結(jié).pass}"></property> -->
    <property name="poolConfig" ref="poolConfig"></property>
  </bean>

  <!--redis操作模版,使用該對象可以操作redis -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
    <property name="connectionFactory" ref="jedisConnectionFactory" />
    <!--如果不配置Serializer,那么存儲的時候缺省使用String,如果用User類型存儲,那么會提示錯誤User can't cast to String??! -->
    <property name="keySerializer" >
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="valueSerializer" >
      <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
    </property>
    <property name="hashKeySerializer">
      <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    </property>
    <property name="hashValueSerializer">
      <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
    </property>
    <!--開啟事務(wù) -->
    <property name="enableTransactionSupport" value="true"></property>
  </bean >

</beans>

方式2:通過jedis客戶端工具實(shí)現(xiàn)對Redis的操作 spring-jedis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">

  <!-- 連接池基本參數(shù)配置,類似數(shù)據(jù)庫連接池 -->
  <context:property-placeholder location="classpath:conf/redis.properties" ignore-unresolvable="true" />

  <!-- redis連接池 -->
  <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="${redis.maxActive}" />
    <property name="maxIdle" value="${redis.maxIdle}" />
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
  </bean>

  <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
    <constructor-arg name="poolConfig" ref="poolConfig" />
    <constructor-arg name="host" value="${redis.host}" />
    <constructor-arg name="port" value="${redis.port}" type="int" />
    <constructor-arg name="timeout" value="${redis.timeout}" type="int" />
    <constructor-arg name="password" value="${redis.password}" />
    <constructor-arg name="database" value="${redis.database}" type="int" />
  </bean>

</beans>

步驟4:在web.xml中進(jìn)行 進(jìn)行 servletContext上下文讀取

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   <!--classpath:spring/spring-redis.xml,-->
    classpath:spring/spring-jedis.xml,
  </param-value>
 </context-param>

步驟5:接入測試

方式1:測試代碼

@Controller
@RequestMapping("/redis")
public class RedisController {

@Resource(name="redisTemplate") 
  private RedisTemplate redisTemplate;

  @RequestMapping("/operate.do")
  @ResponseBody
  public Map springRedisDo() {
    Map result=new HashMap();

    // stringRedisTemplate的操作
    // String讀寫
    redisTemplate.delete("myStrKey");
    redisTemplate.opsForValue().set("myStrKey", "strValue");
    String strValue= (String) redisTemplate.opsForValue().get("myStrKey");
    result.put("strValue",strValue);

    // List讀寫
    redisTemplate.delete("myListKey");
    redisTemplate.opsForList().rightPush("myListKey", "listValue1");
    redisTemplate.opsForList().rightPush("myListKey", "listValue2");
    redisTemplate.opsForList().leftPush("myListKey", "listValue3");
    List<String> myListKeyValues = redisTemplate.opsForList().range("myListKey", 0, -1);
    for (String s : myListKeyValues) {
      System.out.println("myListKey數(shù)據(jù)元素>>>"+s);
    }
    result.put("myListKeyValues",myListKeyValues);

    // Set讀寫
    redisTemplate.delete("mySet");
    redisTemplate.opsForSet().add("mySetKey", "setValue1");
    redisTemplate.opsForSet().add("mySetKey", "setValue2");
    redisTemplate.opsForSet().add("mySetKey", "setValue3");
    redisTemplate.opsForSet().add("mySetKey", "setValue3");
    redisTemplate.opsForSet().add("mySetKey", "setValue3");
    Set<String> setValues = redisTemplate.opsForSet().members("mySetKey");
    for (String s : setValues) {
      System.out.println("mySetKey數(shù)據(jù)元素>>>"+s);
    }
    result.put("setValues",setValues);

    // Hash讀寫
    redisTemplate.delete("myHashKey");
    redisTemplate.opsForHash().put("myHashKey", "BJ", "北京");
    redisTemplate.opsForHash().put("myHashKey", "SH", "上海");
    redisTemplate.opsForHash().put("myHashKey", "TJ", "天津");
    Map<String, String> hashValues = redisTemplate.opsForHash().entries("myHashKey");
    List myHashList= redisTemplate.opsForHash().values("myHashKey");
    System.out.println("myHashList數(shù)據(jù)信息>>>"+myHashList);
    for (Map.Entry entry : hashValues.entrySet()) {
      System.out.println("myHashValues>>>"+entry.getKey() + " - " + entry.getValue());
    }
    result.put("hashValues",hashValues);

    return result;
  }
}

spring 封裝了 RedisTemplate 對象來進(jìn)行對redis的各種操作,它支持所有的 redis 原生的 api。在RedisTemplate中提供了幾個常用的接口方法的使用,分別是:

RedisTemplate中定義了對5種數(shù)據(jù)結(jié)構(gòu)操作

  • redisTemplate.opsForValue();//操作字符串
  • redisTemplate.opsForHash();//操作hash
  • redisTemplate.opsForList();//操作list
  • redisTemplate.opsForSet();//操作set
  • redisTemplate.opsForZSet();//操作有序set

注:StringRedisTemplate與 RedisTemplate關(guān)系

StringRedisTemplate繼承RedisTemplate,兩者的數(shù)據(jù)是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數(shù)據(jù),RedisTemplate只能管理RedisTemplate中的數(shù)據(jù)。SDR默認(rèn)采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。StringRedisTemplate默認(rèn)采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。RedisTemplate默認(rèn)采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

方式2:測試代碼

@Controller
@RequestMapping("/jedis/")
public class JedisController {

  @Autowired
  private JedisPool jedisPool;

  
  /**
   * @Method: 
   * @Author: 
   * @Description:
   * param: 通過jedis客戶端,往Redis中 存入數(shù)據(jù)
   * @Return: 
   * @Exception: 
   * @Date: 2020/9/10 10:38
   */
  @RequestMapping("save")
  @ResponseBody
  public Map getSave(String key, String val) {
    Map result=new HashMap();
    boolean executeResult=false;
    Jedis jedis = null;
    try {
      jedis = jedisPool.getResource();
      jedis.set(key, val);
      executeResult=true;
    } catch (Exception e) {
      System.out.println("獲取jedis鏈接異常"+e);
    }
    result.put("executeResult",executeResult);
    return result;
  }

  /**
   * @Method: 
   * @Author: 
   * @Description:
   * param: 查詢Redis中存儲的信息
   * @Return: 
   * @Exception: 
   * @Date: 2020/9/10 10:40
   */
  @RequestMapping("queryKeyInfo.do")
  @ResponseBody
  public Map getKey(String key) {
    Map result=new HashMap();
    Jedis jedis = jedisPool.getResource();
    String redisValue=jedis.get(key);
    result.put("key",redisValue);
    return result;
  }
}

通過redis.clients.jedis.JedisPool來管理,即通過池來管理,通過池對象獲取jedis實(shí)例,然后通過jedis實(shí)例直接操作redis服務(wù),剔除了與業(yè)務(wù)無關(guān)的冗余代碼,從工廠類到池的方式變化,就相當(dāng)于mybatis連接mysql方變化是一樣的,代碼變得更簡潔,維護(hù)也更容易了。Jedis使用apache commons-pool2對Jedis資源池進(jìn)行管理,所以在定義JedisPool時一個很重要的參數(shù)就是資源池GenericObjectPoolConfig

注:使用JedisPool 的方式進(jìn)行redis操作時候,需要設(shè)置redis服務(wù)的登錄密碼,否則會有相應(yīng)的錯誤提示。redis.windows.conf 文件中 通過修改requirepass 信息來進(jìn)行redis服務(wù)訪問密碼設(shè)置,并通過redis-server.exe redis.windows.conf 命令方式進(jìn)行訪問,否則會報錯:redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot打jar包遇到的xml文件丟失的解決方案

    SpringBoot打jar包遇到的xml文件丟失的解決方案

    這篇文章主要介紹了SpringBoot打jar包遇到的xml文件丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java窗體居中顯示的2種方法(實(shí)例講解)

    Java窗體居中顯示的2種方法(實(shí)例講解)

    下面小編就為大家?guī)硪黄狫ava窗體居中顯示的2種方法(實(shí)例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能

    SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能

    本文介紹SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預(yù)覽時會在同級目錄下創(chuàng)建一個相同文件名后綴為pdf的文件,每次預(yù)覽會先查找文件是否存在,存在則直接預(yù)覽,不存在則會走上面的處理,需要的朋友可以參考下
    2022-02-02
  • springboot整合redis實(shí)現(xiàn)發(fā)送郵箱并驗(yàn)證

    springboot整合redis實(shí)現(xiàn)發(fā)送郵箱并驗(yàn)證

    大家好,本篇文章主要講的是springboot整合redis實(shí)現(xiàn)發(fā)送郵箱并驗(yàn)證,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包的方法(圖解)

    IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包的方法(圖解)

    這篇文章主要介紹了IntelliJ IDEA Java項(xiàng)目手動添加依賴 jar 包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 分布式調(diào)度器之Spring Task 的使用詳解

    分布式調(diào)度器之Spring Task 的使用詳解

    SpringTask是Spring框架中用于任務(wù)調(diào)度的組件,通過簡單的注解就能實(shí)現(xiàn)定時任務(wù)的創(chuàng)建和調(diào)度,可以通過配置線程池來實(shí)現(xiàn),本文給大家介紹分布式調(diào)度器之Spring Task 的使用,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • SpringBoot實(shí)現(xiàn)根據(jù)手機(jī)號獲取歸屬地

    SpringBoot實(shí)現(xiàn)根據(jù)手機(jī)號獲取歸屬地

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何實(shí)現(xiàn)根據(jù)手機(jī)號獲取歸屬地,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • springboot配置druid多數(shù)據(jù)源的示例代碼

    springboot配置druid多數(shù)據(jù)源的示例代碼

    這篇文章主要介紹了springboot配置druid多數(shù)據(jù)源的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • springboot開啟mybatis二級緩存的步驟詳解

    springboot開啟mybatis二級緩存的步驟詳解

    這篇文章給大家介紹了springboot開啟mybatis二級緩存的詳細(xì)步驟,文中通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法

    SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法

    本篇文章主要介紹了SpringBoot定義過濾器、監(jiān)聽器、攔截器的方法,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04

最新評論

衡南县| 高陵县| 镇宁| 苗栗县| 长治县| 永清县| 屏东县| 苏尼特左旗| 梧州市| 凤山市| 新和县| 施秉县| 荔浦县| 杭锦旗| 宁南县| 中江县| 昭通市| 武义县| 平乡县| 焦作市| 土默特右旗| 靖州| 富源县| 依兰县| 昂仁县| 扎赉特旗| 富源县| 阜新| 施秉县| 彰化市| 舒兰市| 漯河市| 喜德县| 榆林市| 柯坪县| 正定县| 漠河县| 五河县| 金坛市| 汤原县| 洮南市|