阿里网盘链接
文章目录
初始NoSQL数据库
对比MySQL数据库
从结构方面:
-
SQL数据库是一个结构化的数据库:对于数据库中的每一个字段都有相对应的严格的约束。约束不好进行修改
-
NoSQL数据库是一个非结构化的数据库:
-
键值型数据库,对键和值的定义约束很随意
-
文档型,将数据一条一条的存储进去,一般使用json,字段描述是任意的id、name都可以
-
图类型(graph)数据库,数据作为结点,用联系连接
-
从关系方面:
- SQL:有关联的数据库使用外键以关联两个表之间的关系。具体体现在两个已经关联的表不能轻易删除其中一个;
- NoSQL:无关联的数据库使用json嵌套的方式描述表之间的关系。首先没有关联,有冗余。
从查询方式:
- SQL查询的语法相对固定
- NoSQL查询的语法使用相对宽松,没有相对的标准,不同的NoSQL数据库的查询语法都不同。
- 使用起来相对起来简单,熟悉
从事物方面:
- SQL满足ACID
- NoSQL满足BASE,不能完全满足ACID
Redis入门
Redis数据结构
redis是一个键值型的数据库,key一般是String类型,不过value有多种数据类型
redis命令行的使用
官方文档(可以使用edge浏览器翻译)
访问Radis
我们有两种方式来访问Radis数据库
-
命令行客户端
-
使用语法:
-
-
图形化客户端
通用命令(tab键:自动补全)
KEYS
DEL
EXISTS
EXPIRE
TTL
String类型常见命令
SET
GET
MSET
MGET
INCR
INCRBY
DECR
INCRBYFLOAT
SETNX
SETEX
Hash类型常见命令
Hash结构可以将对象中的每一个字段独立存储,对单个字段做CRUD
HSET
HGET
HMSET
HMGET
HGETALL
HKEYS
HVALS
HINCRBY
List类型常见命令
Redis中的List类型可以看做是一个双向链表的结构。可以正向检索和反向检索。
特点:
- 有序
- 元素可以重复
- 插入和删除速度快
- 查询速度一般
LPUSH
LPOP
RPUSH
RPOP
LRANGE
BLPOP
BRPOP
Set类型常见命令
Redis的Set结构与java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个Hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
SADD
SREM
SCARD
SISMEMBER
SMEMBERS
SINTER
SDIFF
SUNION
SortedSet类型常见命令
可以排序的ste集合。SortedSet的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表加Hash表;SortedSet具备下列特性:
- 可排序性
- 元素不重复
- 查询速度快
注意:经常被用于排行表这个功能
ZADD
ZREM
ZSCORE
ZRANK
ZCARD
ZCOUNT
ZINCRBY
ZRANGE
ZRANGEBYSCORE
ZRANGEBYSCORE
ZDIFF/ZINTER/ZUNION
使用KEY命令
层级格式存储:用于分别不同类型的数据
在图形客户端中会自动形成文件夹分级,从而实现观感上的提升
java的radis编程客户端(Spring Data Radis整合了Jedis和Lettuce)
Jedis客户端的使用
Jedis官方网址
- 常见一个Maven工程
- 引入Jedis依赖和单元测试依赖(junit5)
- 建立连接
private jedis jedis;
@BeforeEach
void setUp(){
// 建立连接 (第一个参数,radis客户端的ip地址;第二个参数,radis客户端的端口号)
jedis = new Jedis("192.168.150.101",6379);
// 设置密码
jedis.auto("123321");
// 选择(第一个)库
jedis.select(0);
}
- 测试string
@Test
void testString(){
// 插入数据,方法就是radis的名称
String result = redis.set("name","张三");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash(){
// 插入Hash数据
jedis.hset("user:1","name","jack");
jedis.hset("user:1","age","18");
// 获取hash数据资源
Map<String, String> map = jedis.hgetAll("user:1");
// 打印输出
System.out.println(map);
}
- 释放资源
@AfterEach
void tearDown(){
// 释放资源
if(jedis != null){
jedis.close();
}
}
Jedis链接池
public class JedisConnectionFactory{
private static final JedisPool jedisPool;
static{
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大链接
jedisPoolConfig.setMaxTotle(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间,ms
jedisPoolConfig.setMaxWaitMillis(200);
// 参数分别为连接池对象、redis的ip地址、端口号、密码
jedisPool = new JedisPool(jedisPoolConfig,"192.168.150.101",6379,1000,"123321")
}
// 获取Jedis对象
public static Jedis getjedis(){
return jedisPool.getResource();
}
}
步骤:
-
配置连接池
-
创建连接池对象
-
上面的“建立连接”步骤可以改为:
- jedis = JedisConnectionFactory.getjedis();
-
关闭连接的操作也在底层中与前面的略有区别(改为了释放资源)
Springboot集成springDataRedis使用步骤
spring 已经自动整合了SpringDataRedis,并且已经自动装配
步骤:
- 引入依赖
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>common-pools</artifactId>
</dependency>
- 配置radis的地址信息(yml)
spring:
redis:
host:192.168.150.101
port:6379
password:123321
lettuce:
pool:
max-active:8 #最大连接数量
max-idle:8 #最大空闲连接
min-idle:0 #最小空闲连接
max-wait:100 #连接等待时间
- 注入RedisTemplate(自动装配:拿来就用)
@Autowired
private RedisTemplate redisTemplate;
- 编写测试
@SpringBootTest
public class RedisTest{
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString (){
// 插入一条String类型的数据
redisTemplate.opsForValue().set("name","李四");
// 读取一条String类型的数据
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name=" + name);
}
}
RedisTemplate的RedisSerializer序列化工具
原生的radis使用的是JDK的RedisSerializer,但是在实际应用中,生成的key和value是不好用的,key的字符串非常的长;value的字符串转换为了16进制数。
自定义RedisSerializer步骤
- 在pom中引入Jackson依赖
<!--jackson依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
将类用@Configuration注释后使用
@Bean
public RedisTemplate<String,Object> redisTemplate(RadisConnectionFactory radisConnectionFactory) throws UnknownHostException{
// 创建Template对象
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(radisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// key和hashKey采用string序列化
redisTemplate.setKeySerializer(RedisSerializer.toString());
redisTemplate.setHashValueSerializer(RedisSerializer.toString());
// value和hashValue采用JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return reidsTemplate;
}外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimg.picui.cn%2Ffree%2F2024%2F06%2F15%2F666cf0e6c9acb.png&pos_id=img-m430JoJ7-1718416816392)
StringRedisTemplate向radis客户端传入对象数据
@Autowired
private StringRedisTemplate stringRedisTemplate;
// JSON工具
private static final Objectmapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException{
// 准备工作 实体类的创建
User user = new User("虎哥",18);
// 手动序列化
String json = mapper.writeValueAsString(user);
// 写入一条数据到redis
stringRedisTemplate.opsForValue().set("user:200",json);
// 读入数据
String val = stringRedisTemplate.opsForValue().get("user:200");
// 反序列化
User user1 = mapper.redisValue(val,User.class);
System.out.println("user1 = " = user1);
}
注意:在将上述代码封装成工具类之后,可以省略掉 准备工作 和 手动序列化 这两个步骤