SQL:结构化查询语言 => 关系型数据库
NoSQL:非关系型数据库
SQL与NoSQL的差异:
Redis官方只提供了Linux版本
KEYS:查看符合模板的所有key
不建议在生产环境(或集群的主节点)上使用。Redis单线程,会导致线程阻塞。
KEYS *name*
DEL:删除key
DEL username
DEL username password
EXISTS:判断key存在
EXISTS username
EXPIRE:给key设置有效期,单位是秒(到期自动删除)
TTL:查看有效期(-2表示不存在、-1表示永不过期)
EXPIRE name 20
TTL name
字符串,最简单的数据类型。上限是512M。
String的类型
常见命令
INCR age
:age++)INCRBY age 2
:age += 2)INCRBYFLOAT level 2
:level += 2)key的结构:层级存储。用于key名称的设置,避免了key重复的问题
项目名:业务名:类型:id hpan:user:username:1 hpan:admin:username:1
无序字典,类似JSON。
相比于序列化JSON,以字符串形式保存。Hash结构可以更方便地修改。
常见命令
HSET user:1 username wmh
)HSET user:1 username
)HINCRBY user:4 age 2
:user[4].age+=2)双向链表,类似于LinkedList。可以正向、反向查找。
无序、元素不可重复、查找速度快、支持交集、并集、差集等。
单个Set:
Set之间:
每个元素都带一个score属性,根据score排序。可排序、元素不重复、查询速度快。
排名默认为升序,降序排名需要加上REV:ZRANK → ZREVRANK
SpringDataRedis:整合了Jedis、letture
redis/jedis: Redis Java client (github.com)
Jedis使用:
1、引入依赖
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>5.0.0version>
dependency>
2、建立连接
Jedis jedis = new Jedis("localhost", 6379);
jedis.auth("123.com");
jedis.set("name", "wmhs");
jedis.close();
多线程 → 使用Jedis连接池
Spring Data Redis
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。
不同数据类型的操作API封装到了不同的类型中
RedisTemplate可以接收Object作为值写入Redis。
But,采用JDK序列化Object为字节形式。占用内存大、可读性差。
So,可以自行编写RedisSerializer实现(使用jackson
)。
But,写入的对象有@class
属性,造成了额外开销。
Spring默认提供了一个StringRedisTemplate类,KV的序列化方式默认就是String方式。
如何存对象? → 自行序列化和反序列化
常见的JSON序列化库:
使用步骤:
1、导入pom.xml
配置
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
2、配置application.yml
spring:
data:
redis:
port: 6379
host: 127.0.0.1
password: 123456
database: 0
timeout: 10000
lettuce:
pool:
enabled: true
max-active: 100
max-wait: 10000
max-idle: 10
min-idle: 1
3、编写测试类
不连接数据库启动SpringBoot项目
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@Test
void StringRedisTemplateTest() {
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
// name
ops.set("name", "wmh");
System.out.println("name: " + ops.get("name"));
// yx
ops.set("yx", gson.toJson(new User("yx", 18)));
String yx = ops.get("yx");
System.out.println("yx: " + gson.fromJson(yx, User.class));
}