redis相关知识点
redis 的相关知识点
启动
启动代码
redis-cli -a 密码
通用命令
expire: 设置有效期
expire name 10
key
key *
相关数据类型
String
set:添加或者修改已经存在的一个String类型的键值对
set age 19
get:根据key获取String类型的value
get age
mset:批量添加多个String类型的键值对
mset k1 v1 k2 v2
mget:根据多个key获取多个String类型的value
mget k1 k2
incr:让一个整型的key自增1
incr age
19--->20
incrby:让一个整型的key自增并指定步长
incrby age 2
incrby age -1
incrbyfloat:让一个浮点类型的数字自增并指定步长
incrbyfloat score 0.5
setnx:添加一个String类型的键值对,前提是这个key不存在,否则不执行
setnx name leixin
setex:添加一个String类型的键值对,并且指定有效期
setex names 10 "leixin"
Hash类型
HSET key field value:添加或者修改hash类型key的field的值
hset leixin:name name "leixin"
hset leixin:name name2 "leixin"
HGET key field:获取一个hash类型key的field的值
hget leixin:name name2
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
hgetall leixin:name
HKEYS:获取一个hash类型的key中的所有的field
hkeys leixin:name
HVALS:获取一个hash类型的key中的所有的value
hvals leixin:name
HINCRBY:让一个hash类型key的字段值自增并指定步长
hincrby leixin:name age 2
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
List
特征与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
- 常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
如何利用List结构模拟一个栈?
入口和出口在同一边
如何利用List结构模拟一个队列?
入口和出口在不同边
如何利用List结构模拟一个阻塞队列?
入口和出口在不同边出队时采用BLPOP或BRPOP
LPUSH key element ... :向列表左侧插入一个或多个元素
lpush users 1 2 3 4 5
此时实际为 5 4 3 2 1
RPUSH key element ... :向列表右侧插入一个或多个元素
rpush users 6 7
此时实际为 5 4 3 2 1 6 7
LPOP key count:移除并返回列表左侧的count个元素,没有则返回nil
lpop users 3
此时移除并返回 5 4 3
RPOP key count:移除并返回列表右侧的count元素
rpop users 3
此时移除并返回的是 7 6 1
LRANGE key star end:返回一段角标范围内的所有元素
lrange users 0 0
此时返回的是 2
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
blpop users2 100
此时等待中
这个时候新开一个控制台
lpush users2 1
此时不超过100s的话就会出来结果
1) "users2"
2) "1"
(34.91s)
Set
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
SADD key member ... :向set中添加一个或多个元素
sadd s1 a b c
SREM key member ... : 移除set中的指定元素
srem s1 a
SCARD key: 返回set中元素的个数
scard s1
SISMEMBER key member:判断一个元素是否存在于set中
sismember s1 b
SMEMBERS:获取set中的所有元素
smembers s1
SINTER key1 key2 ... :求key1与key2的交集
SDIFF key1 key2 ... :求key1与key2的差集
SUNION key1 key2 ..:求key1和key2的并集
SortedSet
- 可排序
- 元素不重复
- 查询速度快
ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
zadd students 87 jack 88 jerry
ZREM key member:删除sorted set中的一个指定元素
zrem students jack
ZSCORE key member : 获取sorted set中的指定元素的score值
zscore students jerry
ZRANK key member:获取sorted set 中的指定元素的排名
zrank students jerry
排名是从0开始的
ZCARD key:获取sorted set中的元素个数
zcard students
ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
SpringDataRedis
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | 通用的命令 |
快速入门
导入依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
配置文件
spring:
redis:
host: 192.168.122.120
port: 6379
password: 73883672
jedis:
pool:
max-active: 8
max-idle: 0
max-wait: 100ms
进行测试
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
//写入一条String数据
redisTemplate.opsForValue().set("name","google");
//获取String数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}
此时会发现redis数据库只有一些转码了的序列,此时我们需要进行手动序列化
@Configuration
public class RedisConfig { @Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}此时测试注入对象
@Test
void testSaveUser(){
//User有两个参数,一个是name,一个是age
redisTemplate.opsForValue().set("user:100",new User("leixin",20));
User o =(User) redisTemplate.opsForValue().get("user:100");
System.out.println("o = "+o);
}
此时发现多了一个class参数,数据量一大,这是非常浪费空间的。
{
"@class": "com.leixin.pojo.User",
"name": "leixin",
"age": 20
}
简单优化
- 使用StringRedisTemplate
- 写入Redis时,手动把对象序列化为JSON
- 读取Redis时,手动把读取到的JSON反序列化为对象
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testString(){
stringRedisTemplate.opsForValue().set("name","leixin");
String name = stringRedisTemplate.opsForValue().get("name");
System.out.println(name);
}
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testSaveUser() throws JsonProcessingException {
// 创建对象
User user = new User("虎哥", 21);
// 手动序列化
String json = mapper.writeValueAsString(user);
// 写入数据
stringRedisTemplate.opsForValue().set("user:200", json);
// 获取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
// 手动反序列化
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println("user1 = " + user1);
}
@Test
void testHash() {
stringRedisTemplate.opsForHash().put("user:400", "name", "虎哥");
stringRedisTemplate.opsForHash().put("user:400", "age", "21");
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
System.out.println("entries = " + entries);
}
redis相关知识点的更多相关文章
- redis 相关知识点
(1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Value类型的 ...
- Redis基础知识点面试手册
Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...
- UITableView相关知识点
//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...
- Android开发涉及有点概念&相关知识点(待写)
前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...
- IOS开发涉及有点概念&相关知识点
前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...
- IOS之UI--小实例项目--添加商品和商品名(使用xib文件终结版) + xib相关知识点总结
添加商品和商品名小项目(使用xib文件终结版) 小贴士:博文末尾有项目源码在百度云备份的下载链接. xib相关知识点总结 01-基本使用 一开始使用xib的时候,如果要使用自定义view的代码,就需要 ...
- 学习记录013-NFS相关知识点
一.NFS相关知识点 1.NFS常用的路径/etc/exports NFS服务主配置文件,配置NFS具体共享服务的地点/usr/sbin/exportfs NFS服务的管理命令,exportfs -a ...
- TCP/IP 相关知识点与面试题集
第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...
- Python开发一个csv比较功能相关知识点汇总及demo
Python 2.7 csv.reader(csvfile, dialect='excel', **fmtparams)的一个坑:csvfile被csv.reader生成的iterator,在遍历每二 ...
随机推荐
- python的for循环基本用法
for循环 for循环能做到的事情 while循环都可以做到 但是for循环语法更加简洁 并且在循环取值问题上更加方便 name_list = ['jason', 'tony', 'kevin', ' ...
- 一行代码,让 VS Code 内置 PDF 阅读器变成深色模式
使用 CSS/JS 简单实现 PDF 深色模式.
- Java中日期格式化的实现算法
package com.study.test; import java.io.Serializable; import java.text.SimpleDateFormat; import java. ...
- 最新MATLAB R2020b超详细安装教程(附完整安装文件)
摘要:本文详细介绍Matlab R2020b的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用. ...
- JS的URIencode方式
BEGIN; 对需要传递的URL参数进行URLencode编码 刚开始浪费了很多时间都没搞出来,不知道怎么用.后面google到了不少解决方案,最终解决.转载下面内容: js对文字进行编码涉及3个函数 ...
- Python实现双X轴双Y轴绘图
诈尸人口回归.这一年忙着灌水忙到头都掉了,最近在女朋友的提醒下终于想起来博客的账号密码,正好今天灌水的时候需要画一个双X轴双Y轴的图,研究了两小时终于用Py实现了.找资料的过程中没有发现有系统的文章, ...
- 攻防世界-MISC:base64stego
这是攻防世界新手练习区的第十一题,题目如下: 点击下载附件一,发现是一个压缩包,点击解压,发现是需要密码才能解密 先用010editor打开这个压缩包,这里需要知道zip压缩包的组成部分,包括压缩源文 ...
- lab_1 清华大学ucore bootload启动ucore os(预备基础知识+实验过程)
实验1 :bootload启动ucore os 1.0实验内容: lab1中包含一个bootloader和一个OS.这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式 ...
- 服务器 CPU 100% 异常排查实践与总结
一个执着于技术的公众号 问题背景 昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就 ...
- 《Mybatis 手撸专栏》第7章:SQL执行器的定义和实现
作者:小傅哥 博客:https://bugstack.cn - <手写Mybatis系列> 一.前言 为什么,要读框架源码? 因为手里的业务工程代码太拉胯了!通常作为业务研发,所开发出来的 ...