目录
一、认识NoSql
1、定义:
2、常见语法
3、与关系型数据库(SQL)的区别:
二、认识Redis
1、定义:
2、特征:
3、Key的结构:
三、安装Redis
四、Redis常见命令
1、数据结构介绍
2、Redis的通用命令
(1)KEYS:查看符合模板的所有key
(2)DEL:删除一个指定的key
(3)EXISTS:判断key是否存在
(4)EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
(5)TTL:查看一个KEY的剩余有效期
3、String类型的命令
(1)SET:添加或者修改已经存在的一个String类型的键值对
(2)GET:根据key获取String类型的value
(3)MSET:批量添加多个String类型的键值对
(4)MGET:根据多个key获取多个String类型的value
(5)INCR:让一个整型的key自增1
(6)INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
(7)INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
(8)SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
(9)SETEX:添加一个String类型的键值对,并且指定有效期
4、Hash类型的命令
(1)HSET key field value:添加或者修改hash类型key的field的值
(2)HGET key field:获取一个hash类型key的field的值
(3)HMSET:批量添加多个hash类型key的field的值
(4)HMGET:批量获取多个hash类型key的field的值
(5)HGETALL:获取一个hash类型的key中的所有的field和value
(6)HKEYS:获取一个hash类型的key中的所有的field
(7)HVALS:获取一个hash类型的key中的所有的value
(8)HINCRBY:让一个hash类型key的字段值自增并指定步长
(9)HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
5、List类型的命令
(1)LPUSH key element ... :向列表左侧插入一个或多个元素
(2)LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
(3)RPUSH key element ... :向列表右侧插入一个或多个元素
(4)RPOP key:移除并返回列表右侧的第一个元素
(5)LRANGE key star end:返回一段角标范围内的所有元素
(6)BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
6、Set类型的命令
(1)SADD key member ... :向set中添加一个或多个元素
(2)SREM key member ... : 移除set中的指定元素
(3)SCARD key: 返回set中元素的个数
(4)SISMEMBER key member:判断一个元素是否存在于set中
(5)SMEMBERS:获取set中的所有元素
(6)SINTER key1 key2 ... :求key1与key2的交集
(7)SDIFF key1 key2 ... :求key1与key2的差集
(8)SUNION key1 key2 ... :求key1与key2的并集
7、SortedSet类型的命令
(1)ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
(2)ZREM key member:删除sorted set中的一个指定元素
(3)ZSCORE key member : 获取sorted set中的指定元素的score值
(4)ZRANK key member:获取sorted set 中的指定元素的排名
(5)ZCARD key:获取sorted set中的元素个数
(6)ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
(7)ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
(8)ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
(9)ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
(10)ZDIFF、ZINTER、ZUNION:求差集、交集、并集
五、Redis的Java客户端
1、实现jedis
(1)引入依赖
(2)建立连接,编写yml文件
(3)测试
2、jedis连接池
3、SpringDataRedis
(1)定义
(2)实现
4、RedisTemplate
5、StringRedisTemplate
NoSQL是指非关系型数据库,在这种数据库中,数据没有被组织成关系表,而是以一种更灵活的方式存储。NoSQL数据库通常不需要预定义模式以及支持水平扩展能力,这使得它们能够处理大规模和分布式数据。
NoSQL数据库可分为4类:键值存储、文档存储、列存储和图形数据库。
键值存储:通过在每个键上存储对应的值,实现简单的数据将数据以键值对的形式保存,例如Redis、Memcached等。
文档存储:文档数据存储在类似JSON的无模式格式中。文档存储在MongoDB、Couchbase等数据库中。
列存储:数据存储在列簇中,而不是行中,适合存储结构化和半结构化数据。例如HBase。
图形数据库:图形数据库是一种结构化数据存储方式,用于处理图形或半结构化数据。例如Neo4j、OrientDB等。
Redis是一个开源的,基于内存的键值对存储数据库,可以用作缓存、消息队列、计数器等。
- 键值(key-value)型,value支持多种不同数据结构,功能丰富
- 单线程,每个命令具备原子性
- 低延迟,速度快(基于内存、IO多路复用、良好的编码)。
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
安装指南https://blog.csdn.net/icbbm/article/details/134895407?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134895407%22%2C%22source%22%3A%22icbbm%22%7D
在官网( https://redis.io/commands )可以查看到不同的命令
以“a”开头
先批量创建键,再做批量删除,此时因为k4不存在,所以只删掉3个
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
KEY |
VALUE |
|
field |
value |
|
heima:user:1 |
name |
Jack |
age |
21 |
|
heima:user:2 |
name |
Rose |
age |
18 |
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
redis.clients
jedis
5.0.0
spring:
redis:
host: 192.168.248.152
port: 6379
password: 1234
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100ms
@Test
void testSaveUser() {
// 写入数据
redisTemplate.opsForValue().set("user:100", new User("哥", 21));
// 获取数据
User o = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("o = " + o);
}
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:Spring Data Redis
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
API |
返回值类型 |
说明 |
redisTemplate.opsForValue() |
ValueOperations |
操作String类型数据 |
redisTemplate.opsForHash() |
HashOperations |
操作Hash类型数据 |
redisTemplate.opsForList() |
ListOperations |
操作List类型数据 |
redisTemplate.opsForSet() |
SetOperations |
操作Set类型数据 |
redisTemplate.opsForZSet() |
ZSetOperations |
操作SortedSet类型数据 |
redisTemplate |
通用的命令 |
1.引入依赖
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2.配置yml文件
spring:
redis:
host: 192.168.248.152
port: 6379
password: 1234
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100ms
3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4.测试
@Test
void testString() {
// 写入一条String数据
redisTemplate.opsForValue().set("name", "虎哥");
// 获取string数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
缺点:
- 可读性差
- 内存占用较大
自定义RedisTemplate的序列化方式代码:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate 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() 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);
}