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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值