概念
Redis是一个基于内存中的key-value数据结构存储系统,常用作:数据库、缓存、消息中间件。
被称为结构化的Nosql数据库,非关系型数据库。
常见的关系型数据库(RDBMS):Mysql Oracle DB2 SQLServer
非关系型数据库(NoSql):
Redis
、Mongo db、MemCached
应用场景:
缓存、任务队列、消息队列、分布式锁
特点:
基于内存存储,读写性能高
适合存储热点数据(热点商品、资讯、新闻)
企业应用广泛
数据类型
Redis存储的是key-value
结构的数据,其中key
是字符串
类型,数据
保存在value
中,因此Redis的数据类型实际上是指value的数据类型
数据类型 | 描述 | 特点 |
---|---|---|
String | 普通字符串(常用) | |
hash | 哈希表 | 是一个String类型的field和value的映射表,适合存储对象 |
list | 列表 | 简单的字符串列表,按照插入顺序排序,可以有重复元素 |
set | 无序集合 | String类型的无序集合,集合成员唯一,不能重复 |
sorted set / zset | 有序集合,没有重复元素 | 与Set相似,但每个元素都会关联一个double类型的分数 |
下面是存储结构示意图:
常用命令
- String操作命令
命令 | 说明 |
---|---|
SET key value | 设置指定key的值 |
GET key | 获取指定key的值 |
SETEX key seconds value | 设置key的值,并且key的过期时间设为seconds秒 |
SETNX key value | 只有在key不存在时设置key的值,如果存在不进行任何操作 |
- hash操作命令
命令 | 说明 |
---|---|
HSET key field value | 将key中的字段field的值设为value |
HGET key field | 获取存储在哈希表中指定字段的值 |
HDEL key field | 删除存储在哈希表中的指定字段 |
HKEYS key | 获取哈希表中所有字段 |
HVALS key | 获取哈希表中所有值 |
HGETALL key | 获取在哈希表中指定key的所有字段和值 |
- List列表操作命令
命令 | 说明 |
---|---|
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
RPOP key | 移除并获取列表最后一个元素 |
LLEN key | 获取列表长度 |
BRPOP key1 [key2] timeout |
- set集合操作命令
命令 | 说明 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SDIFF key1 [key2] | 返回给定所有集合的差集 |
SREM key member1 [member2] | 移除集合中一个或多个成员 |
- Zset有序集合操作命令
命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加一个或多个成员 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的程序员 |
ZINCRBY key increament member | 有序集合中对指定成员的分数加上增量increament |
ZREM key member [member] | 移除有序集合中的一个或多个成员 |
- 通用命令
命令 | 说明 |
---|---|
KEYS pattern | 查找所有符合给定模式(pattern)的key |
EXISTS key | 检查给定key是否存在 |
TYPE key | 返回key所存储的值的类型 |
TTL key | 返回给定key的剩余生存时间(TTL,time to live),以秒为单位 |
DEL key | key存在时删除key |
Java操作Redis
现在项目大多数都是基于Spring boot开发
的,Spring整合了Redis的操作方式,提供了Spring Data Redis
用来简化Redis操作。
- 第一步导坐标
xml
<dependency>
<groupld>org.springframework.boot</groupld>
<artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>
- 第二步在yml中配置Redis
yml
redis:
host: localhost
port: 6379
#选择要操作的几号数据库(默认有15个数据库)
database: 0
jedis:
#Redis连接池配置
oppl:
max-active: 8 #设置最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接
- 第三步通过
RedisTemplate
对象操作Redis
Spring Data Redis中提供了一个高度封装的类: RedisTemplate
,针对jedis
客户端中大量api
进行了归类封装
,将同一类型操作封装为operation
接口,具体分类如下:
分类 | 说明 | 获取方法 |
---|---|---|
ValueOperations | 简单的K-V操作 | opsForValue() |
SetOperations | set类型数据操作 | opsForSet() |
ZSetOperations | zset类型数据操作 | opsForZSet() |
HashOperations | 针对map类型的数据操作 | opsForHash() |
ListOperations | 针对List类型的数据操作 | opsForList() |
我们在Test测试类中注入RedisTemplate对象,并通过这个对象来操作Redis
例如:添加字符串类型 key
为name,value
为zhangsan
java
@SpringBootTest
@RunWith(SptingRunner.class)
public class Test{
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
//添加字符串name为张三
redisTemplate.opsForValue().set("name","zhangsan");
}
}
由于RedisTemplate会默认将key序列化存储,如果要修改序列化方式,则需要创建一个配置类
java
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//默认的Key序列化器为JdkSerializationRedisserializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashkeySerializer(new StringRedisserializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}