一、前言
作为NoSQL的代表Redis在互联网系统中提升性能起到了举足轻重的作用。作为一个从事Java后端的工作者对Redis的学习是必不可少的。
参考:C语言编程网
二、学习笔记整理
Redis的特点
- Redis服务器采用内存存储键值对,性能高。
- 数据半结构化,更少规则,读取相对于关系数据库更快。
- 支持六种数据类型(字符串、哈希、集合、列表、排序集合、基数)
- 操作原子性,适合高并发场景
- MuiltiUtility工具,Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。
总结:Redis作为NoSQL适合于缓存工具,应用于高并发场景(如抢红包,商场秒杀等)
Java使用Redis的方法
- 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 &#61; new Jedis("host",6379);
jedis.auth("pwd");
jedis.set("TestKey","lyf");
System.out.println(jedis.get("TestKey"));
}
}
- Spring 整合 redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
&#xff08;1&#xff09;几种操作数据操作
采用redistemplate进行操作Redis十分的方便&#xff0c;注意若val为Java对象时&#xff0c;需要进序列化&#xff0c;并且进行redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer())设置。
&#64;Test
void test1(){
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"));
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")&#43;";"&#43;
redisTemplate.opsForValue().size("TestData"));
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
Person person &#61; new Person();
person.setAge(19);
person.setName("Person1");
List<Role> roleList &#61; 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 &#61; new HashMap<>();
map.put("key1","data1");
map.put("key2","data2");
redisTemplate.opsForValue().set("testMap",map);
System.out.println(redisTemplate.opsForValue().get("testMap"));
redisTemplate.opsForHash().putAll("mapKey",map);
System.out.println(redisTemplate.opsForHash().get("mapKey","key1"));
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 &#61; redisTemplate.opsForList().range("list",0,2);
list.stream().forEach(System.out::print);
}
&#xff08;2&#xff09;事务操作
使用SessionCallBack进行提交执行。
&#64;Test
void test2(){
SessionCallback sessionCallback &#61; new SessionCallback() {
&#64;Override
public Object execute(RedisOperations opts) throws DataAccessException {
opts.multi();
opts.boundValueOps("key").set("value");
String val &#61; (String) opts.boundValueOps("key").get();
System.out.println("设置key还未执行value为"&#43;val);
List list &#61; opts.exec();
val &#61; (String)redisTemplate.opsForValue().get("key");
return val;
}
};
String val &#61; (String) redisTemplate.execute(sessionCallback);
System.out.println(val);
}
&#xff08;3&#xff09;发布订阅模式
- 先在Redis工具中进行 采用 SUBSCRIBE 设置注册客户端。
- 然后进行设置消息监听
&#64;SpringBootTest
public class Public {
&#64;Autowired
RedisTemplate redisTemplate;
&#64;Test
void publicMsg(){
redisTemplate.convertAndSend("TestChannel","this is a test msg!!");
}
}
- 发布订阅信息&#xff0c;监听就可以打印消息了
public class RedisMessageListen implements MessageListener {
&#64;Autowired
RedisTemplate redisTemplate;
&#64;Override
public void onMessage(Message message, byte[] bytes) {
byte[] body &#61;message.getBody();
String Body &#61; (String) redisTemplate.getValueSerializer().deserialize(body);
System.out.println(Body);
}
}
(4)关于内存回收
Redis 的 key 超时不会被其自动回收&#xff0c;它只会标识哪些键值对超时了。
Redis 提供两种方式回收这些超时键值对&#xff0c;它们是定时回收和惰性回收。
定时回收是指在确定的某个时间触发一段代码&#xff0c;回收超时的键值对。
惰性回收则是当一个超时的键&#xff0c;被再次用 get 命令访问时&#xff0c;将触发 Redis 将其从内存中清空。
六种回收策略