springboot系列之redis

简介

  • redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化
  • 可以支持每秒十几万此的读/写操作
  • Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。
  • redis持久有两种方式:快照(快照,默认dump.rdb中),仅附加文件(AOF)

快照(快照)

1,将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
2,保存900 1 

#900秒内如果超过1个Key被修改,则启动快照保存
3,保存300 10 

#300秒内如果超过10个Key被修改,则启动快照保存
4,保存60 10000 

#60秒内如果超过10000个重点被修改,则启动快照保存

仅附加文件(AOF)

1,使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)
2,AOF持久化存储方式参数说明
    appendonly yes  

           #开启AOF持久化存储方式 
    appendfsync always 

         #收到写命令后就立即写入磁盘,效率最差,效果最好
    appendfsync everysec

         #每秒写入磁盘一次,效率与效果居中
    appendfsync no 

         #完全依赖操作系统,效率最佳,效果没法保证
  • 清除所有缓存 flushall
  • Script Flush 命令用于清除所有 Lua 脚本缓存
  • 配置文件设置daemonize为yes,将以后台形式启动redis

springboot中使用redis

  • springboot系列之redis
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
	<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>

  • 添加配置文件:
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=50
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=30
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=10

redisUtils编写(重点),注意存储对象必须实现Serializable接口

/**
 * @auther 高松
 * @DATE 2019/7/20  14:02
 * spring-redis
 */
@Component
public class RedisUtils {
    //springboot自动注入
    @Resource
    private RedisTemplate<Object,Object> redisTemplate;
    /**
     * 默认redis使用jdkSerializationRedisSerializer,这样存入redis时进行序列化变为二进制这样不方便查看看
     * 需要自行设置为字符串序列化方便查看存入的值
     * 值得注意的是当我们进行模糊查询时,由于没有设置字符串序列化会影响我们模糊查询的结果
     * 当然如果要存入对象我们需要让pojo实现Serializable接口
     */
    @PostConstruct
    public  void Init(){
        RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.afterPropertiesSet();
    }
    /**
     * 常用操作对象
     * 1.字符串操作
     * 2.散列集合操作(hash)
     */
    public void stringOps(){
        //1.字符串操作
        User user = new User();
        user.setSex("jj");
        user.setName("gs");
        redisTemplate.opsForValue().set("gsong",user);
        System.out.println(redisTemplate.opsForValue().get("gsong"));
    }
    public void hashOps(){
        //2.hash操作
        User user = new User();
        user.setSex("jj");
        user.setName("gs");
        redisTemplate.opsForHash().put("gsongHash","myself",user);
        redisTemplate.opsForHash().get("gsongHash","name");
        Map<Object, Object> gsongHash = redisTemplate.opsForHash().entries("gsongHash");
        gsongHash.entrySet().iterator().forEachRemaining(a -> System.out.println(a.getKey()+":"+a.getValue()));
        //设置过期
        redisTemplate.expire("gsongHash",10, TimeUnit.SECONDS);
    }

    /**
     * 那么在同一个连接中多个redis命令该怎么办呢,实现
     */
    public  void opsManyTimes(){
        User user = new User();
        user.setSex("jj");
        user.setName("gs");
        redisTemplate.execute(
                new SessionCallback() {
            @Override
            public Object execute(RedisOperations redisOperations) throws DataAccessException {
                redisOperations.opsForValue().set("gsong3",user);
                redisOperations.opsForHash().put("gsong3Hash","USER",user);
                return null;
            }
        });
    }

    /**
     * 当然我们怎么操作lua脚本呢?,lua脚本能保证我们操作的原子性
     * 值得注意的是springboot默认使用的是lettuce操作Redis应为它的异步和集群支持
     */
    public void   opScript(){
        //获取底层连接对象类似(jedis)
        RedisScriptingCommands redisScriptingCommands = redisTemplate.getConnectionFactory().getConnection().scriptingCommands();
        //返回一个乱脚本标识码
        String sha1 = redisScriptingCommands.scriptLoad("return redis.call('SET',KEYS[1],ARGV[1])".getBytes());
        System.out.println("lua脚本标识码"+sha1);
        //执行lua脚本
        Object o = redisScriptingCommands.evalSha(sha1, ReturnType.STATUS, 1, "GSONGLUA".getBytes(), "GSONGLUA".getBytes());
        System.out.println("执行结果!"+o.toString());

    }


    /**
     *模糊匹配,?(单个字符),*(多个字符)
     * */
    public  void likeOps(){
        Iterator<Object> iterator = redisTemplate.keys("gsong*").iterator();
        StringBuilder stringBuilder = new StringBuilder(".");
        iterator.forEachRemaining(a-> stringBuilder.append(a));
        System.out.println(stringBuilder.toString());
    }
}



源码地址:链接:https://pan.baidu.com/s/12mMcTQOoRfXR4JhErp9Ktg
提取码:9vvv

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答问题。但是,需要说明的是,关于Spring Boot和Redis的使用,需要具体的场景和需求,才能给出更加准确的答案。我可以为您提供一些参考资料和建议,供您参考: 首先,Spring Boot已经内置了对Redis的支持,它通过Spring Data Redis框架对Redis进行封装,提供了一系列的API来操作Redis中的数据。您可以通过在pom.xml文件中添加依赖,来引入Spring Data Redis: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接下来,在application.properties或application.yml中配置Redis的连接信息。例如: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` 配置完成后,您就可以在代码中使用Redis了。例如: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; ``` 上面的代码中,首先通过@Autowired注解注入了一个RedisTemplate来操作Redis。然后,您可以使用RedisTemplate提供的方法来对Redis进行读写操作,例如: ``` redisTemplate.opsForValue().set("key", "value"); String value = (String) redisTemplate.opsForValue().get("key"); ``` 上面的代码中,首先使用opsForValue方法获取一个ValueOperations对象,然后通过set方法将键值对写入Redis。接着,通过get方法获取Redis中的值。 当然,在实际的应用场景中,您可能需要根据具体的需求来对Redis进行更加复杂的读写操作。例如,您可以使用Redis的hash数据结构来存储对象,使用Redis的list数据结构来实现消息队列等等。对于这些更加复杂的操作,可以参考Spring Data Redis官方文档或者其他相关的参考资料。 希望上面的回答能够为您提供一些帮助,如果您还有其他问题,欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值