Spring+Redis的部署與Redis緩存使用示例


由於項目的業務需要,這兩天折騰了一下Spring-redis配置,有了前面用Spring托管hibernate的經驗,這次可以說是順風順水,大概說一下流程。

ubuntu 安裝 redis

sudo apt install redis-server

安裝后在/etc/redis目錄下可以找到redis.conf文件,直接搜索PASSWORD可以找到設置密碼的地方,出於安全考慮我設置了一個。默認端口6379通常不用改,之后用ubuntu默認開啟服務的方法就可以運行redis。

此后可以用ubuntu的包管理方法啟動redis,此處不表。

項目需要加載的庫文件

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.2</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
            <version>1.13.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.8.3.RELEASE</version>
        </dependency>

網上的資料通常只有jedis和spring-data-redis,實際上沒有另外兩個你的項目是跑不起來的。

添加配置

在spring的配置文件中能夠添加如下字段,之后我會分開解。

  <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="300" />
        <property name="maxTotal" value="1024" />
        <property name="maxWaitMillis" value="1000" />
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="localhost"/>
        <property name="port" value="6379"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
        <property name="usePool" value="true"/>
        <property name="password" value="hahaschool"/>
    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="hashKeySerializer" ref="stringRedisSerializer"/>
        <property name="enableTransactionSupport" value="true" />
    </bean>
  • jedisPoolConfig是redis的連接池配置,設置了jedis的一些基本信息。
  • jedisConnectionFactory配置了地址,端口號,密碼,連接池等信息,類似於hibernate的主配置文件。
  • stringRedisSerializer是配置redis的序列化方法,也可以選擇jdbc的序列化方法。
  • redisTemplate和hibernateTemplate類似,是Spring控制redis的方法,也是核心所在,它的參數主要是序列化選項。對於redis而言,其事務比hibernate的事務配起來更方便,直接在這里配置了不需要其他改動。

例子,用redis緩存實現token

TokenDao

@Repository
public class TokenDao {
    private final RedisTemplate<String, String> redisTemplate;
    private final static long validTime=60;

    @Autowired
    public TokenDao(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
    public void put(String token, String name){
        redisTemplate.boundValueOps(token).set(name,validTime,TimeUnit.MINUTES);
    }

    public String get(String token) {
        return redisTemplate.opsForValue().get(token);
    }

    public void delete(String token){
        redisTemplate.delete(token);
    }
}

TokenService

@Service
public class TokenService {
    private final TokenDao tokenDao;

    @Autowired
    public TokenService(TokenDao tokenDao) {
        this.tokenDao = tokenDao;
    }

    public String generateToken(String accoutNumber){
        String token= UUID.randomUUID().toString().replace("-","");
        tokenDao.put(token,accoutNumber);
        return token;
    }

    public String getAccountNumber(String token){
        return tokenDao.get(token);
    }

    public void delete(String token){
        tokenDao.delete(token);
    }
}

RestHelloController

@RestController
@CrossOrigin
@RequestMapping(value = "api")
public class RestHelloController {
    private final HelloService helloService;
    private final TokenService tokenService;

    @Autowired
    public RestHelloController(HelloService helloService, TokenService tokenService) {
        this.helloService = helloService;
        this.tokenService = tokenService;
    }

    @RequestMapping("token/{name}")
    public String token(@PathVariable String name){
        return tokenService.generateToken(name);
    }
    @RequestMapping("name/{name}/{message}")
    public void add(@PathVariable String name,@PathVariable String message){
        helloService.add(name,message);
    }
    @RequestMapping("{token}")
    public String get(@PathVariable String token){
        return helloService.showMessage(tokenService.getName(token));
    }
}

boundValueOps相對於opsForValue,會有檢查token是否被使用的操作,進而更新token的消亡時間。運行好Redis,mysql,tomcat后,在瀏覽器輸入:

http://localhost:8080/api/name/Xiaoming/Good

創建了用戶Xiaoming和他的信息。

輸入
http://localhost:8080/api/token/Xiaoming

返回一條token,我這邊是dad0724ead8a4d7a98564ab316cf37fd

之后輸入
http://localhost:8080/api/dad0724ead8a4d7a98564ab316cf37fd

會顯示出信息Good。


免責聲明!

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



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