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 | |
