Redis 学习日记(第一天)
Redis
Redis 是当前互联网流行的 NoSQL(Not Only SQL)数据库。
Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。
用法
对于常用数据,第一次从数据库读出,然后就存放在NoSQL中,这样以后就无须再访问数据库,需要从NoSQL中读出即可,性能就会比数据库块的多。对于那些高并发的操作,可以在NoSQL上完成写入,等待一个时刻再批量写法数据库,这样能满足系统的性能要求。
原因
1)响应速度快
2)支持6种数据类型 。它们是字符串,哈希结构,列表,集合,排序集合和基数。
3)操作都是原子性
4)可以在如缓存,消息传递队列中使用(Redis支持“发布+订阅”的消息模式)
使用的考虑一下下面方面
1)业务数据常用吗?命中率如何?如果命中率低,就没有必要写入缓存。
2)改业务数据是读操作多,还是写操作多,如果写操作多,需要频繁写入数据库,也没有必要使用缓存。
3)业务数据大小如何?如果要存储几百兆的文件,会给缓存带来很大的压力,有必要?
Redis 对字符串操作的常用命令
这个是在springBoot2 下写的
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testRedis(){
// 设置 值
String key = "springboot1";
String key2 = "springboot2";
stringRedisTemplate.opsForValue().set(key,"value1");
stringRedisTemplate.opsForValue().set(key2,"value2");
// 通过key 获取 value
String value = stringRedisTemplate.opsForValue().get(key);
log.info("key :"+key+"value :"+value);
// 通过key 删除value
stringRedisTemplate.delete(key);
// 求长度
Long length = stringRedisTemplate.opsForValue().size(key2);
log.info("key 2:"+key2+" size : "+length);
// 设置新值 并返回旧值
String oldValue = stringRedisTemplate.opsForValue().getAndSet(key2,"new value2");
log.info("old value :"+oldValue);
// 获取key2 的值
String value2 = stringRedisTemplate.opsForValue().get(key2);
log.info(" value2 :"+value2);
// 求子串
String rangeValue2 = stringRedisTemplate.opsForValue().get(key2,0,3);
log.info(" range value 2 :"+rangeValue2);
// 追加字符串在末尾,返回新串长度
int newLen = stringRedisTemplate.opsForValue().append(key2,"_newAdd");
log.info("new length :"+newLen);
String appendValue2 = stringRedisTemplate.opsForValue().get(key2);
log.info("new value2 "+appendValue2);
stringRedisTemplate.delete(key2);
// 测试一下redis 的运算
stringRedisTemplate.opsForValue().set(key,"10");
stringRedisTemplate.opsForValue().increment(key,1);
sout(stringRedisTemplate,key);
stringRedisTemplate.opsForValue().increment(key,-5);
sout(stringRedisTemplate,key);
stringRedisTemplate.opsForValue().decrement(key,3);
sout(stringRedisTemplate,key);
stringRedisTemplate.opsForValue().increment(key,1.2);
sout(stringRedisTemplate,key);
}
private void sout(StringRedisTemplate stringRedisTemplate ,String key){
String value = stringRedisTemplate.opsForValue().get(key);
log.info("--value--"+value);
}
Redis哈希数据结构和常用命令
@Autowired
RedisTemplate<String,Object> redisTemplate;
@Test
public void testRedisHas(){
String key = "hash_key";
Map<String,String> map = new HashMap<>();
map.put("file1","vaule1");
map.put("file2","value2");
//hash 结构设置多个键值对
redisTemplate.opsForHash().putAll(key,map);
//在 hash 结构中设置键值对
redisTemplate.opsForHash().put(key,"f3","10");
soutHash(redisTemplate,key,"file2");
// 判断hash结构是否有这个字段
boolean existKey = redisTemplate.opsForHash().hasKey(key,"f3");
log.info(" 是否存在 f3 这个字段 :"+existKey);
// 获取所有的 hash 结构的键值
Map keyMap = redisTemplate.opsForHash().entries(key);
log.info(keyMap.toString());
//在某个字段增值
/* redisTemplate.opsForHash().increment(key,"f3",10);
soutHash(redisTemplate,key,"f3");*/
// 获取所有的值
List valueList = redisTemplate.opsForHash().values(key);
log.info(valueList.toString());
//返回所有的键
Set keyList = redisTemplate.opsForHash().keys(key);
log.info(keyList.toString());
// 增加键值
List<Object> fieldList = Arrays.asList("file1","file2");
List valueList2 = redisTemplate.opsForHash().multiGet(key,fieldList);
log.info(valueList2.toString());
//修改 值 当 hash 结构中不存在对应的键,才设置值
boolean success = redisTemplate.opsForHash().putIfAbsent(key,"f3","99");
log.info(String.valueOf(success));
// 删除某些字段
long result = redisTemplate.opsForHash().delete(key,"file1","file2");
log.info(""+result);
// 获取所有的 hash 结构的键值
Map keyMap2 = redisTemplate.opsForHash().entries(key);
log.info(keyMap2.toString());
//在使用大的 hash 结构时,需要考虑返回数据的大小,以避免返回太多的数据,引发 JVM 内存溢出或者 Redis 的性能问题。
// 说句没有用的 :
// 内存溢出 是对象太大,对你爱太满
//内存泄漏 对象无法回收 , 死都不放手
}
自己写着玩,一些命令忘记了,来查阅。