• 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。

  • 相关阅读:
    Spring Boot笔记一 输出hello
    Java Web之表单重复提交问题
    Java Web之验证码
    Java Web之下载文件
    Java工具之上传文件
    Java Web之上传文件
    Java Web之EL
    Java Bean的规范
    Java Web之JSP
    《FPGA全程进阶---实战演练》第一章之如何学习FPGA
  • 原文地址:https://www.cnblogs.com/jay36/p/7684986.html
Copyright © 2020-2023  润新知