Redis 学习基本知识整理

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习基本知识整理相关的知识,希望对你有一定的参考价值。

一、前言

作为NoSQL的代表Redis在互联网系统中提升性能起到了举足轻重的作用。作为一个从事Java后端的工作者对Redis的学习是必不可少的。

参考:C语言编程网

二、学习笔记整理

Redis的特点

  1. Redis服务器采用内存存储键值对,性能高。
  2. 数据半结构化,更少规则,读取相对于关系数据库更快。
  3. 支持六种数据类型(字符串、哈希、集合、列表、排序集合、基数)
  4. 操作原子性,适合高并发场景
  5. MuiltiUtility工具,Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。

总结:Redis作为NoSQL适合于缓存工具,应用于高并发场景(如抢红包,商场秒杀等)

Java使用Redis的方法

  1. Jedis
  <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.1.0</version>
        </dependency>
public class JedisTest {
    public static void main(String[]args){
        Jedis jedis = new Jedis("host",6379);
        jedis.auth("pwd");
        jedis.set("TestKey","lyf");
        System.out.println(jedis.get("TestKey"));
    }
}
  1. Spring 整合 redis

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

(1)几种操作数据操作

采用redistemplate进行操作Redis十分的方便,注意若val为Java对象时,需要进序列化,并且进行redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer())设置。

// 测试基本类型的使用
    @Test
    void test1(){

        // Redis运算
        // 进行序列化操作,否则出现Integer识别错误
        redisTemplate.setValueSerializer(new GenericToStringSerializer<Integer>(Integer.class));
        redisTemplate.opsForValue().set("counter","1");
        System.out.println(redisTemplate.opsForValue().get("counter"));
        redisTemplate.opsForValue().increment("counter",1);
        System.out.println(redisTemplate.opsForValue().get("counter"));

        // Redis字符串基本操作
        // 设置String
        redisTemplate.setValueSerializer(new GenericToStringSerializer<>(String.class));
        redisTemplate.opsForValue().set("TestData","TestString");
        System.out.println(redisTemplate.opsForValue().get("TestData"));
        redisTemplate.opsForValue().append("TestData","AppendData");
        System.out.println(redisTemplate.opsForValue().get("TestData")+";"+
                redisTemplate.opsForValue().size("TestData"));

        // 设置对象
        // 考虑序列化设置???
        // 应当设置JDK
        // JavaBean需要进行实现Serializable
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        //redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        Person person = new Person();
        person.setAge(19);
        person.setName("Person1");
        List<Role> roleList = new ArrayList<>();
        roleList.add(new Role("admin","HHH"));
        person.setRoles(roleList);
        System.out.println(person);
        redisTemplate.opsForValue().set("TestObject",person);
        System.out.println(redisTemplate.opsForValue().get("TestObject"));

        Map<String,String> map = new HashMap<>();
        map.put("key1","data1");
        map.put("key2","data2");
        redisTemplate.opsForValue().set("testMap",map);
        System.out.println(redisTemplate.opsForValue().get("testMap"));

        // RedisHash操作  存储的一个
        redisTemplate.opsForHash().putAll("mapKey",map);
        System.out.println(redisTemplate.opsForHash().get("mapKey","key1"));

        // RedisList列表
        redisTemplate.opsForList().leftPush("list","listData1");
        redisTemplate.opsForList().leftPush("list","listData2");
        redisTemplate.opsForList().leftPush("list","listData3");
        System.out.println(redisTemplate.opsForList().index("list",2));
        List<String> list = redisTemplate.opsForList().range("list",0,2);
        list.stream().forEach(System.out::print);

        // RedisSet集合

    }

(2)事务操作

使用SessionCallBack进行提交执行。

// 测试事务
    @Test
    void test2(){

        SessionCallback sessionCallback = new SessionCallback() {
            @Override
            public Object execute(RedisOperations opts) throws DataAccessException {

                opts.multi();// 执行事务
                opts.boundValueOps("key").set("value");
                String val = (String) opts.boundValueOps("key").get();
                System.out.println("设置key还未执行value为"+val);

                List list  = opts.exec();
                val = (String)redisTemplate.opsForValue().get("key");

                return val;
            }
        };
        String val = (String) redisTemplate.execute(sessionCallback);
        System.out.println(val);
    }

(3)发布订阅模式

  1. 先在Redis工具中进行 采用 SUBSCRIBE 设置注册客户端。
  2. 然后进行设置消息监听

@SpringBootTest
public class Public {
    @Autowired
    RedisTemplate redisTemplate;

    @Test
    void publicMsg(){
        redisTemplate.convertAndSend("TestChannel","this is a test msg!!");
    }

}

  1. 发布订阅信息,监听就可以打印消息了
public class RedisMessageListen implements MessageListener {

    @Autowired
    RedisTemplate redisTemplate;
    @Override
    public void onMessage(Message message, byte[] bytes) {
          //message.getBody()
        byte[] body =message.getBody();
        String Body = (String) redisTemplate.getValueSerializer().deserialize(body);
        System.out.println(Body);

    }
}

(4)关于内存回收

Redis 的 key 超时不会被其自动回收,它只会标识哪些键值对超时了。

Redis 提供两种方式回收这些超时键值对,它们是定时回收和惰性回收。
定时回收是指在确定的某个时间触发一段代码,回收超时的键值对。
惰性回收则是当一个超时的键,被再次用 get 命令访问时,将触发 Redis 将其从内存中清空。

六种回收策略

在这里插入图片描述

以上是关于Redis 学习基本知识整理的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习总结整理

资深腾讯架构师耗时2个月整理的Redis全套学习笔记,涵盖所有核心知识点

资深腾讯架构师耗时2个月整理的Redis全套学习笔记,涵盖所有核心知识点

通宵整理的Redis知识点(含视频),看完膨胀了!

redis module 学习—官网文档整理

Redis 学习 —— 数据类型及操作