国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享

Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享

2021-01-28 12:03素文宅 Java教程

這篇文章主要為大家詳細(xì)介紹了Spring Boot高級(jí)教程之使用Redis實(shí)現(xiàn)session共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Redis是一個(gè)緩存消息中間件及具有豐富特性的鍵值存儲(chǔ)系統(tǒng)。Spring BootJedis客戶端庫和由Spring Data Redis提供的基于Jedis客戶端的抽象提供自動(dòng)配置。spring-boot-starter-redis'Starter POM'為收集依賴提供一種便利的方式。

引入spring-boot-starter-redis,在pom.xml配置文件中增加配置如下(基于之前章節(jié)“Spring Boot 構(gòu)建框架”中的pom.xml文件):

?
1
2
3
4
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

可以注入一個(gè)自動(dòng)配置的RedisConnectionFactoryStringRedisTemplate或普通的跟其他Spring Bean相同的RedisTemplate實(shí)例。默認(rèn)情況下,這個(gè)實(shí)例將嘗試使用localhost:6379連接Redis服務(wù)器。

?
1
2
3
4
5
6
7
8
9
10
@Component
public class MyBean {
  private StringRedisTemplate template;
  
  @Autowired
  public MyBean(StringRedisTemplate template) {
    this.template = template;
  }
  // ...
}

如果添加一個(gè)自己的任何自動(dòng)配置類型的@Bean,它將替換默認(rèn)的(除了RedisTemplate的情況,它是根據(jù)bean的名稱'redisTemplate'而不是它的類型進(jìn)行排除的)。如果在classpath路徑下存在commons-pool2,默認(rèn)會(huì)獲得一個(gè)連接池工廠。

應(yīng)用使用Redis案例

添加配置文件,配置內(nèi)容如下:

?
1
2
3
4
5
6
7
# REDIS (RedisProperties)
# Redis服務(wù)器地址
spring.redis.host=192.168.0.58
# Redis服務(wù)器連接端口
spring.redis.port=6379
# 連接超時(shí)時(shí)間(毫秒)
spring.redis.timeout=0

redis配置類,具體代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConn {
   
  private String host;
   
  private int port;
   
  private int timeout;
 
 
  public String getHost() {
    return host;
  }
 
  public void setHost(String host) {
    this.host = host;
  }
 
  public int getPort() {
    return port;
  }
 
  public void setPort(int port) {
    this.port = port;
  }
 
  public int getTimeout() {
    return timeout;
  }
 
  public void setTimeout(int timeout) {
    this.timeout = timeout;
  }
 
  @Override
  public String toString() {
    return "Redis [localhost=" + host + ", port=" + port + ", timeout=" + timeout + "]";
  }
   
 
}

注意:在RedisConn類中注解@ConfigurationProperties(prefix = "spring.Redis")的作用是讀取springboot的默認(rèn)配置文件信息中以spring.redis開頭的信息。

配置cache類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.stereotype.Component;
 
import com.cachemodle.RedisConn;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
 
/**
*
* @author sandsa redis cache service
*
*/
 
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
 
  @Autowired
  private RedisConn redisConn;
   
  /**
  * 生產(chǎn)key的策略
  *
  * @return
  */
 
  @Bean
  @Override
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
 
      @Override
      public Object generate(Object target, Method method, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append(target.getClass().getName());
        sb.append(method.getName());
        for (Object obj : params) {
          sb.append(obj.toString());
        }
        return sb.toString();
      }
    };
 
  }
 
  /**
  * 管理緩存
  *
  * @param redisTemplate
  * @return
  */
 
  @SuppressWarnings("rawtypes")
  @Bean
  public CacheManager CacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
    // 設(shè)置cache過期時(shí)間,時(shí)間單位是秒
    rcm.setDefaultExpiration(60);
    Map<String, Long> map = new HashMap<String, Long>();
    map.put("test", 60L);
    rcm.setExpires(map);
    return rcm;
  }
   
  /**
  * redis 數(shù)據(jù)庫連接池
  * @return
  */
 
  @Bean
  public JedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory factory = new JedisConnectionFactory();
    factory.setHostName(redisConn.getHost());
    factory.setPort(redisConn.getPort());
    factory.setTimeout(redisConn.getTimeout()); // 設(shè)置連接超時(shí)時(shí)間
    return factory;
  }
 
  /**
  * redisTemplate配置
  *
  * @param factory
  * @return
  */
  @SuppressWarnings({ "rawtypes", "unchecked" })
  @Bean
  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
    StringRedisTemplate template = new StringRedisTemplate(factory);
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
  }
 
}

分析:緩存類繼承的是CachingConfigurerSupport,它把讀取的配置文件信息的RedisConn類對(duì)象注入到這個(gè)類中。在這個(gè)類中keyGenerator()方法是key的生成策略,CacheManager()方法是緩存管理策略,redisConnectionFactory()是redis連接,redisTemplate()方法是redisTemplate配置信息,配置后使redis中能存儲(chǔ)Java對(duì)象。

測(cè)試配置是否成功,實(shí)例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class TestRedis {
  @Autowired
  private StringRedisTemplate stringRedisTemplate; // 處理字符串
  
  @Autowired
  private RedisTemplate redisTemplate; // 處理對(duì)象
  @Test
  public void test() throws Exception {
    stringRedisTemplate.opsForValue().set("yoodb", "123");
    Assert.assertEquals("123", stringRedisTemplate.opsForValue().get("yoodb"));
  }
}

簡單封裝的Redis工具類,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import java.io.Serializable;
import java.util.Set;
import java.util.concurrent.TimeUnit;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
 
@Component
public class RedisUtils {
 
  @SuppressWarnings("rawtypes")
  @Autowired
  private RedisTemplate redisTemplate;
 
  /**
   * 批量刪除對(duì)應(yīng)的value
   *
   * @param keys
   */
  public void remove(final String... keys) {
    for (String key : keys) {
      remove(key);
    }
  }
 
  /**
   * 批量刪除key
   *
   * @param pattern
   */
  @SuppressWarnings("unchecked")
  public void removePattern(final String pattern) {
    Set<Serializable> keys = redisTemplate.keys(pattern);
    if (keys.size() > 0)
      redisTemplate.delete(keys);
  }
 
  /**
   * 刪除對(duì)應(yīng)的value
   *
   * @param key
   */
  @SuppressWarnings("unchecked")
  public void remove(final String key) {
    if (exists(key)) {
      redisTemplate.delete(key);
    }
  }
 
  /**
   * 判斷緩存中是否有對(duì)應(yīng)的value
   *
   * @param key
   * @return
   */
  @SuppressWarnings("unchecked")
  public boolean exists(final String key) {
    return redisTemplate.hasKey(key);
  }
 
  /**
   * 讀取緩存
   *
   * @param key
   * @return
   */
  @SuppressWarnings("unchecked")
  public Object get(final String key) {
    Object result = null;
    ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
    result = operations.get(key);
    return result;
  }
 
  /**
   * 寫入緩存
   *
   * @param key
   * @param value
   * @return
   */
  @SuppressWarnings("unchecked")
  public boolean set(final String key, Object value) {
    boolean result = false;
    try {
      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
      operations.set(key, value);
      result = true;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return result;
  }
 
  /**
   * 寫入緩存
   *
   * @param key
   * @param value
   * @return
   */
  @SuppressWarnings("unchecked")
  public boolean set(final String key, Object value, Long expireTime) {
    boolean result = false;
    try {
      ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
      operations.set(key, value);
      redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
      result = true;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return result;
  }
 
}

查詢數(shù)據(jù)庫時(shí)自動(dòng)使用緩存,根據(jù)方法生成緩存,參考代碼如下:

?
1
2
3
4
5
6
7
8
@Service
public class UserService {
 @Cacheable(value = "redis-key")
 public UserInfo getUserInfo(Long id, String sex, int age, String name) {
   System.out.println("無緩存時(shí)調(diào)用----數(shù)據(jù)庫查詢");
   return new UserInfo(id, sex, age, name);
 }
}

注意:value的值就是緩存到redis中的key,此key是需要自己在進(jìn)行增加緩存信息時(shí)定義的key,用于標(biāo)識(shí)唯一性的。

Session 共享

分布式系統(tǒng)中session共享有很多不錯(cuò)的解決方案,其中托管到緩存中是比較常見的方案之一,下面利用Session-spring-session-data-redis實(shí)現(xiàn)session共享。

引入依賴,在pom.xml配置文件中增加如下內(nèi)容:

?
1
2
3
4
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>

Session配置,具體代碼如下:

?
1
2
3
4
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}

maxInactiveIntervalInSeconds: 設(shè)置Session失效時(shí)間,使用Redis Session之后,原Spring Bootserver.session.timeout屬性不再生效。

測(cè)試實(shí)例,具體代碼如下:

?
1
2
3
4
5
6
7
8
9
@RequestMapping("uid")
String uid(HttpSession session) {
UUID uid = (UUID) session.getAttribute("uid");
if (uid == null) {
uid = UUID.randomUUID();
}
session.setAttribute("uid", uid);
return session.getId();
}

登錄redis服務(wù)端,輸入命令keys 'session*',查看緩存是否成功。

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

原文鏈接:https://blog.yoodb.com/yoodb/article/detail/1421

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲一区欧美 | 日韩欧美在线一区 | 色五月激情综合网 | 国产美女视频自拍 | 中文字幕av一区二区三区 | 亚洲激情视频在线 | 狠狠中文字幕 | 精品久久一区二区三区 | 日韩高清av | 亚洲第1页| 国产精品久久久久久中文字 | 日本在线一区二区 | 中文在线播放 | 在线国产小视频 | 九九亚洲精品 | 日韩成人在线视频 | 欧美视频精品 | 久久亚 | 韩日精品一区 | 欧美三区| 久综合网| 精品无人乱码一区二区三区的优势 | 日产精品一区二区三区在线观看 | 黄色毛片在线看 | 久草一区 | 91精品一区二区三区久久久久久 | 国产色| 欧美精品在线播放 | 91污在线观看 | 欧美精品一二三区 | 国产高清精品在线 | 国产一级一级特黄女人精品毛片 | 午夜高清视频 | 午夜欧美一区二区三区在线播放 | 欧美亚洲一 | 精品国产91亚洲一区二区三区www | 99精品热 | 91五月天| 99re视频在线观看 | 国产精品女教师av久久 | 在线观看91|