概念
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;
}
}