Redis 学习基本知识整理
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 学习基本知识整理相关的知识,希望对你有一定的参考价值。
一、前言
作为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 = 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>
(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)发布订阅模式
- 先在Redis工具中进行 采用 SUBSCRIBE 设置注册客户端。
- 然后进行设置消息监听
@SpringBootTest
public class Public {
@Autowired
RedisTemplate redisTemplate;
@Test
void publicMsg(){
redisTemplate.convertAndSend("TestChannel","this is a test msg!!");
}
}
- 发布订阅信息,监听就可以打印消息了
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 学习基本知识整理的主要内容,如果未能解决你的问题,请参考以下文章
资深腾讯架构师耗时2个月整理的Redis全套学习笔记,涵盖所有核心知识点