0
点赞
收藏
分享

微信扫一扫

如何通过 CDN 优化网站加载速度

耶也夜 2024-06-19 阅读 31

阿里网盘链接

文章目录

初始NoSQL数据库

对比MySQL数据库

从结构方面:
  1. SQL数据库是一个结构化的数据库:对于数据库中的每一个字段都有相对应的严格的约束。约束不好进行修改

  2. NoSQL数据库是一个非结构化的数据库:

    • 键值型数据库,对键和值的定义约束很随意

    • 文档型,将数据一条一条的存储进去,一般使用json,字段描述是任意的id、name都可以

    • 图类型(graph)数据库,数据作为结点,用联系连接

从关系方面:
  1. SQL:有关联的数据库使用外键以关联两个表之间的关系。具体体现在两个已经关联的表不能轻易删除其中一个;
  2. NoSQL:无关联的数据库使用json嵌套的方式描述表之间的关系。首先没有关联,有冗余。
从查询方式:
  1. SQL查询的语法相对固定
  2. NoSQL查询的语法使用相对宽松,没有相对的标准,不同的NoSQL数据库的查询语法都不同。
    • 使用起来相对起来简单,熟悉
从事物方面:
  1. SQL满足ACID
  2. NoSQL满足BASE,不能完全满足ACID

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis入门

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Redis数据结构

redis是一个键值型的数据库,key一般是String类型,不过value有多种数据类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

redis命令行的使用

官方文档(可以使用edge浏览器翻译)

访问Radis

我们有两种方式来访问Radis数据库

  1. 命令行客户端

    • 使用语法:

  2. 图形化客户端

通用命令(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官方网址

  1. 常见一个Maven工程
  2. 引入Jedis依赖和单元测试依赖(junit5)
  3. 建立连接
private jedis jedis;
    
@BeforeEach
void setUp(){
	// 建立连接 (第一个参数,radis客户端的ip地址;第二个参数,radis客户端的端口号)
    jedis = new Jedis("192.168.150.101",6379);
    // 设置密码
    jedis.auto("123321");
    // 选择(第一个)库
    jedis.select(0);
}
  1. 测试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);
}
  1. 释放资源
@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();
    }
}

步骤:

  1. 配置连接池

  2. 创建连接池对象

  3. 上面的“建立连接”步骤可以改为:

    • jedis = JedisConnectionFactory.getjedis();
  4. 关闭连接的操作也在底层中与前面的略有区别(改为了释放资源)

Springboot集成springDataRedis使用步骤

spring 已经自动整合了SpringDataRedis,并且已经自动装配

步骤:

  1. 引入依赖
<!--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>
  1. 配置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 #连接等待时间
  1. 注入RedisTemplate(自动装配:拿来就用)
@Autowired
private RedisTemplate redisTemplate;
  1. 编写测试
@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步骤
  1. 在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);
}

注意:在将上述代码封装成工具类之后,可以省略掉 准备工作手动序列化 这两个步骤

举报

相关推荐

0 条评论