Redis Note
Redis Note
1. NoSQL
- 与SQL型数据库对比
SQL | NoSQL |
---|---|
结构化 | 非结构化 |
关联化 | 非关联化 |
SQL查询语言 | 没有固定的查询语言 |
事务具有ACID特性(原子性,一致性,隔离性,持久性) | 事务仅具有BASE特性 |
- NoSQL数据库类型
- 键值型数据库:Redis
- 文档型数据库:MongoDB
- 列类型数据库:HBase
- 图表型数据库:Neo4j
2. Redis简介
- 全称:Remote Dictionary Server (Redis),基于内存的键值型NoSQL数据库
- 特征:
存储类型均为键值对的新式,key值一般仅为String类型,value的类型具有多种形式(String,Hash,List,Set,SortedSet,…)
单线程,每个命令具有原子性
低延迟速度快:
- 基于内存
- 多路IO复用
- 良好的编码结构
支持数据持久化
支持主从集群,分片集群:
对于Mysql等结构化查询数据库,其为纵向扩展数据库吗,其主从服务器仅为防止单点失效,并不能提高查询效率,而Redis为水平扩展型数据库,其主从集群可以提高查询效率
支持多语言客户端
3. Redis常用命令及数据结构
3.1 数据结构
基本数据类型 | 特殊数据类型 |
---|---|
String | GEO |
Hash | BitMap |
List | HyperLog |
Set | |
SortedSet |
3.2 Redis通用命令
命令 | 描述 |
---|---|
KEYS | 查看指定的key |
DEL | 删除key对应的键值对 |
EXISTS | 判断key是否存在 |
EXPIRE | 设定指定的key的键值对的生存周期 |
TTL | 查看指定key的生存周期 |
3.3 基于String的命令
命令 | 描述 |
---|---|
SET | 添加或者修改已经存在的一个String类型的键值对 |
GET | 根据key获取String类型的value |
MSET | 批量添加多个String类型的键值对 |
MGET | 根据多个key获取多个String类型的value |
INCR | 让一个整型的key自增1 |
INCRBY | 让一个整型的key自增并指定步长 |
INCRBYFLOAT | 让一个浮点类型的数字自增并指定步长 |
SETNX | 添加一个String类型的键值对,前提是这个key不存在,否则不执行 |
SETEX | 添加一个String类型的键值对,并且指定有效期 |
3.4 基于Hash的命令
命令 | 描述 |
---|---|
HSET key field value | 加或者修改hash类型key的field的值 |
HGET key field | 获取一个hash类型key的field的值 |
HMSET | 批量添加多个hash类型key的field的值 |
HMGET | 批量获取多个hash类型key的field的值 |
HGETALL | 获取一个hash类型的key中的所有的field和value |
HKEYS | 获取一个hash类型的key中的所有的field |
HVALS | 获取一个hash类型的key中的所有的value |
HINCRBY | 让一个hash类型key的字段值自增并指定步长 |
HSETNX | 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 |
3.5 基于List的命令
命令 | 描述 |
---|---|
LPUSH key element ... | 向列表左侧插入一个或多个元素 |
LPOP key | 移除并返回列表左侧的第一个元素,没有则返回nil |
RPUSH key element ... | 向列表右侧插入一个或多个元素 |
RPOP key | 移除并返回列表右侧的第一个元素 |
LRANGE key star end | 返回一段角标范围内的所有元素 |
BLPOP 和 BRPOP | 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil |
3.6 基于Set的命令
命令 | 描述 |
---|---|
SADD key member ... | 向set中添加一个或多个元素 |
SREM key member ... | 移除set中的指定元素 |
SCARD key | 返回set中元素的个数 |
SISMEMBER key member | 判断一个元素是否存在于set中 |
SMEMBERS | 获取set中的所有元素 |
SINTER key1 key2 ... | 求key1与key2的交集 |
SDIFF key1 key2 ... | 求key1与key2的差集 |
SUNION key1 key2 … | 求key1和key2的并集 |
3.7 基于SortedSet的命令
命令 | 描述 |
---|---|
ZADD key score member | 添加一个或多个元素到sorted set ,如果已经存在则更新其score值 |
ZREM key member | 删除sorted set中的一个指定元素 |
ZSCORE key member | 获取sorted set中的指定元素的score值 |
ZRANK key member | 获取sorted set 中的指定元素的排名 |
ZCARD key | 获取sorted set中的元素个数 |
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即可
4. Jedis
使用Java集成Redis,便于通过Java代码操作Redis数据库
步骤:
- 引入依赖
1
2
3
4
5<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>- 建立连接
1
2
3
4
5
6
7
8
9
10
11private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
jedis = new Jedis("192.168.150.101", 6379);
// 设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
}- 测试链接
1
2
3
4
5
6
7
8
9@Test
void testString() {
// 插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name", "张三");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}- 释放连接
1
2
3
4
5
6
7@AfterEach
void tearDown() {
// 释放资源
if (jedis != null) {
jedis.close();
}
}
4.1 Jedis数据库连接池
由于Jedis是线程不安全的,在并发场景下容易出现并发问题,因此采用Jedis数据库连接池进行连接使得Java操作Redis时保证了线程的安全
步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间, ms
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379,
1000, "123321");
}
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
4.2 SpringBoot整合Redis
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | 通用的命令 |
步骤:
- 引入依赖
1 |
|
- 配置文件
1 |
|
- 注入RedisTemplate
1 |
|
- 测试
1 |
|