1.概念
- redis作为一款非关系型数据库,相较于mysql这种关系型数据库来说,因为其是基于内存的存储结构,所以拥有更快速的查询和回馈
- redis是基于键值对(key-value)的形式来存储数据的
2.常用命令
2.1.字符串类型操作命令
- set key value 设置指定key的值
- get key 获取键为key的value值
- 注意:如果先后设置了同一个键的值,那么后设置的值会覆盖前面设置的值
- setex key seconds value 设置制定key的值并且设置存活时间,单位是秒
- setnx key value 只有key不存在的时候才能设置上值
首先给city设置上了beijing这个值,那么这个key就存在了,之后再给这个key设置值就不会执行任何操作
2.2.哈希类型操作命令
redis hash是一个string类型的field和value的映射表,特别适合用来存储对象
- hset key field value 将哈希表key中的字段filed的值设置成value
- hget key field 获取哈希表key中field的值
- hdel key field 删除哈希表key中的字段
- hkeys key 获取哈希表中所有的字段
- hvals key 获取哈希表key中所有的值
- hgetall key 获取哈希表key中所有字段和值
2.3.列表类型操作命令
redis列表是一个简单的字符串列表,按照插入顺序排序,有以下常用指令
- lpush key value 向指定key中插入一个或者多个值
- lrange key start stop 获取列表指定范围内的值,下标从0开始,-1就是从头遍历到尾
- rpop key 移除并获取列表最后一个元素
- llen key 获取列表长度
- brpop key1 [key2] timeout 移除队列的最后一个元素,如果没有元素则会阻塞列表直到等待超时或者发现可弹出元素为止
2.4.集合类型&有序集合类型操作命令
redis set是string类型的无序集合,集合成员是唯一的,常用命令如下
无序集合常用命令
- sadd key member1 [member2] 向集合添加一个或者多个元素
- setmembers key 查询集合所有元素
- scard key 获取集合中的元素个数
- sinter key1 key2 返回两个集合的交集
- sunion key1 key2 返回两个集合的并集
- sdiff key1 key2 返回两个集合的差集
- srem key member1 [member2] 移除集合中的一个或者多个元素
有序集合常用命令
- redis sorted set 有序集合是String类型元素的集合,且不允许重复的成员出现。
- 每个元素都会关联一个double类型的分数(score)redis正是通过分数来为集合中的成员进行从小到大的排序的。
- 有序集合的成员是唯一的,但是分数可以重复
- zadd key score1 member [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
- zrange key start stop [withscores] 通过索引区间返回有序集合中指定区间内的成员
- zincrby key increment member 有序集合中对指定成员的分数加上增量increment
- zrem key member [member...] 移除有序集合中的一个或者多个成员
2.5.Redis常用命令
- keys pattern 查找所有符合给定模式(pattern)的key
- exists key 检查给定key是否存在
- type key 返回key所存储的值的类型
- ttl key 返回给定key的剩余生存时间(TTL,time to live),以秒为单位
- del key 该命令用于在key存在时删除key
![]()
3.在Java中操作redis
在Java中,我们一般使用Jedis技术来操作redis数据库,怎么使用Jedis呢?
3.1.导入依赖
导入Jedis的依赖,如下:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
导入依赖之后,分一下步骤
- 获取连接
- 执行操作
- 关闭连接
@Test
public void test(){
//获取连接
Jedis jedis = new Jedis("localhost",6379);
//执行具体操作
jedis.set("username","xiaoming");
System.out.println(jedis.get("username"));
jedis.hset("001","adr","beijing");
System.out.println(jedis.hget("001","adr"));
Set<String> keys = jedis.keys("*");
String string = keys.toString();
System.out.println(string);
//关闭连接
jedis.close();
}
可以看到,具体操作部分的方法和上面讲的基本操作命令一致
4.使用spring data redis操作redis
在springboot项目中,我们一般使用spring data redis技术来操作redis数据库
4.1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring data redis中提供了一个高度封装的类:redisTemplate,针对jedis客户端中大量的api进行了归类封装,将同一类操作封装为operation接口,具体分类如下:
- ValueOperations: 简单的k-v操作
- SetOperations: set类型数据操作
- ZSetOperations: zset类型数据操作
- HashOperations: 针对map类型的数据操作
- ListOperations: 针对list类型的数据操作
在使用这些接口时,要先向spring容器中注入RedisTemplate这个类,但是这个类,因为使用的序列化方法会把key和value转化成不易于我们查看的形式,所以一般使用StringRedis-Template这个类
@Autowired
private StringRedisTemplate stringRedisTemplate;
但是这个StringRedisTemplate类只能要求k-v数据类型是String,所以还有一个方法,就是修改RedisTemplate这个类的配置,在这个配置类中更改序列化方法,即可,如下:
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.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
下面就展示下每个类型的常用方法,在使用这个类时,得先注入进来,如下(这里举的例子我用的还是StringRedisTemplate类):
@Autowired
private StringRedisTemplate stringRedisTemplate;
注意:在使用redis前,得先开启redis的服务才行
/**
* 普通k-v类型
*/
@Test
void contextLoads() {
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("province","shanxi");
ValueOperations<String, String> stringStringValueOperations = stringRedisTemplate.opsForValue();
stringStringValueOperations.set("XAUAT","xinkong");
System.out.println(valueOperations.get("province"));
}
/**
* 操作Hash类型的数据
*/
@Test
void testHash(){
HashOperations<String, Object, Object> hashOperations = stringRedisTemplate.opsForHash();
//存值
hashOperations.put("China","province","shanxi");
hashOperations.put("China","college","xauat");
//取值
System.out.println(hashOperations.get("China", "province"));
System.out.println(hashOperations.get("China", "college"));
System.out.println("--------------------------------------------");
//获取hash结构中的所有字段
Set<Object> keys = hashOperations.keys("China");
for (Object key:keys) {
System.out.println(key);
}
System.out.println("--------------------------------------------");
//获取hash结构中的所有值
List<Object> lists = hashOperations.values("China");
for (Object list:lists) {
System.out.println(list);
}
}
/**
* 操作list类型的数据
*/
@Test
void testList(){
ListOperations<String, String> listOperations = stringRedisTemplate.opsForList();
//存值
listOperations.leftPushAll("myList","a","b","c","d");
//取值
List<String> myList = listOperations.range("myList", 0, -1);
for (String value : myList) {
System.out.println(value);
}
System.out.println("-----------------------------------------------------------");
//获取列表的长度
Long size = listOperations.size("myList");
int value = size.intValue();
for (int i = 0; i < value; i++) {
//出队列
String element = listOperations.rightPop("myList");
System.out.println(element);
}
}
/**
* 操作set集合类型的数据
*/
@Test
void testSet(){
SetOperations<String, String> setOperations = stringRedisTemplate.opsForSet();
//存值
setOperations.add("mySet04","a","b","c","d");
//取值
Set<String> mySet04 = setOperations.members("mySet04");
for (String s : mySet04) {
System.out.println(s);
}
}
/**
* 操作Zset类型的数据
*/
@Test
void testZSet(){
ZSetOperations<String, String> zSetOperations = stringRedisTemplate.opsForZSet();
//存值
zSetOperations.add("myZSet","a",10.0);
zSetOperations.add("myZSet","b",11.0);
zSetOperations.add("myZSet","c",12.0);
zSetOperations.add("myZSet","a",13.0);
//取值
Set<String> myZSet = zSetOperations.range("myZSet", 0, -1);
for (String s : myZSet) {
System.out.println(s);
}
//修改分数
zSetOperations.incrementScore("myZSet","a",5.0);
//删除成员
zSetOperations.remove("myZSet","c");
}
/**
* 通用操作
*/
@Test
void testCommon(){
//获取redis中所有的key
Set<String> keys = stringRedisTemplate.keys("*");
for (String key : keys) {
System.out.println(key);
}
//判断某个key是否存在
Boolean myZSet = stringRedisTemplate.hasKey("myZSet");
System.out.println(myZSet);
//删除指定的key
//stringRedisTemplate.delete("myZSet");
//获取指定key对应的value的数据类型
DataType type = stringRedisTemplate.type("myZSet");
System.out.println(type.name());
}