Redis简介:
是以key-value形式存储,和传统的关系型数据库不一样.不一定遵循传统数据库的一些基本要求.(非关系型的,分布式的,开源的,水平可拓展的)
优点:
对数据高并发读写(直接是内存中进行读写的)
对海量数据的高效率存储和访问
对数据的可拓展性和高可用性.
单线程操作,每个操作都是原子操作,没有并发相关问题(redis 6)
缺点:
redis(ACID处理非常简单)
无法做太复杂的关系数据库模型
Redis是以key-value store
存储.
键可以包含:(string)字符串,哈希,(list)链表,(set)集合,(zset)有序集合.这些数据集合都指出push/pop,add/remove及取交集和并集以及更丰富的操作.redis支持各种不同方式排序,为了保证效率,数据都是缓存在内存中.它可以从周期性的把更新的数据写入到磁盘或者把修改操作写入追加的文件中.
- 添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- application.properties 添加配置
#application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
#如果设置了密码需要加上
#spring.redis.password=admin
- 注入
@Autowired
private StringRedisTemplate redisTemplate;
- 对应数据类型
String-------opsForValue()
/**
* 操作String
*/
@Test
public void testRedisTemplateString() throws InterruptedException {
// set key value -> 存入键值对
redisTemplate.opsForValue().set("name", "fei");
// get key -> 根据键取出值
System.out.println(redisTemplate.opsForValue().get("name"));
redisTemplate.opsForValue().set("age", "20");
// incr key -> 把值递增1
redisTemplate.opsForValue().increment("age");
// decr key -> 把值递减1
redisTemplate.opsForValue().decrement("age");
// del key -> 根据键删除键值对
redisTemplate.delete("age");
System.out.println("-------删除了 key->age -------");
System.out.println("获取 age,它的vlue为 " + redisTemplate.opsForValue().get("age"));
// setex key timeout value -> 存入键值对,timeout表示失效时间,单位s
redisTemplate.opsForValue().set("time", "timeout", 10, TimeUnit.SECONDS);
// ttl key->可以查询出当前的key还剩余多长时间过期
Thread.sleep(3000);
System.out.println(redisTemplate.getExpire("time"));
// setnx key value -> 如果key已经存在,不做操作, 如果key不存在,直接添加
redisTemplate.opsForValue().setIfAbsent("age", "42");
redisTemplate.opsForValue().setIfAbsent("aa", "12");
}
Hash-------opsForHash()
/**
* 操作 Hash
*/
@Test
public void testRedisTemplateHash() {
// hset key hashkey hashvalue -> 存入一个hash对象
HashMap map = new HashMap();
map.put("name", "fei");
redisTemplate.opsForHash().putAll("user", map);
// hget key hashkey -> 根据hash对象键取去值
System.out.println(redisTemplate.opsForHash().get("user", "name"));
// hexists key hashkey -> 判断hash对象是含有某个键
System.out.println(redisTemplate.opsForHash().hasKey("user", "name"));
System.out.println(redisTemplate.opsForHash().hasKey("user", "age"));
// hdel key hashkey -> 根据hashkey删除hash对象键值对
redisTemplate.opsForHash().delete("user", "name");
System.out.println("--删除了name---" + redisTemplate.opsForHash().get("user", "name"));
}
List-------opsForList()
/**
* 操作 list
*/
@Test
public void testRedisTemplateList() {
// rpush key value -> 往列表右边添加数据
redisTemplate.opsForList().leftPush("apple", "1");
redisTemplate.opsForList().leftPush("apple", "2");
redisTemplate.opsForList().leftPush("apple", "3");
// lrange key start end -> 范围显示列表数据,全显示则设置0 -1
redisTemplate.opsForList().range("apple", 0, -1).forEach(System.err::println);
// lpush key value -> 往列表左边添加数据
redisTemplate.opsForList().rightPush("apple", "a");
System.out.println("------------往列表左边添加数据--------------");
redisTemplate.opsForList().range("apple", 0, -1).forEach(System.err::println);
// lpop key -> 弹出列表最左边的数据
redisTemplate.opsForList().leftPop("apple");
System.out.println("------------弹出列表最左边的数据--------------");
redisTemplate.opsForList().range("apple", 0, -1).forEach(System.err::println);
// rpop key -> 弹出列表最右边的数据
redisTemplate.opsForList().rightPop("apple");
System.out.println("-------------弹出列表最右边的数据-------------");
redisTemplate.opsForList().range("apple", 0, -1).forEach(System.err::println);
// llen key -> 获取列表长度
System.out.println("获取列表长度:" + redisTemplate.opsForList().size("apple"));
}
Set-------opsForSet()
/**
* 操作 set
*/
@Test
public void testRedisTemplateSet() {
// sadd key value -> 往set集合中添加元素
redisTemplate.opsForSet().add("user", "aa", "bb", "cc", "ee");
redisTemplate.opsForSet().add("user2", "aa", "DD", "FF");
// smembers key -> 列出set集合中的元素
redisTemplate.opsForSet().members("user").forEach(System.err::println);
// srem key value -> 删除set集合中的元素
redisTemplate.opsForSet();
System.out.println("---------- 删除set集合中的元素-----------");
redisTemplate.opsForSet().members("user").forEach(System.err::println);
// spop key count -> 随机弹出集合中的元素
System.out.println("随机弹出集合中的元素:" + redisTemplate.opsForSet().pop("user"));
// sdiff key1 key2 -> 返回key1中特有元素(差集)
System.out.println("返回key1中特有元素(差集): " + redisTemplate.opsForSet().difference("user", "user2"));
// sinter key1 key2 -> 返回两个set集合的交集
System.out.println("返回两个set集合的交集 :" + redisTemplate.opsForSet().intersect("user2", "user"));
// sunion key1 key2 -> 返回两个set集合的并集
System.out.println("返回两个set集合的并集 :" + redisTemplate.opsForSet().union("user2", "user"));
// scard key -> 返回set集合中元素个数
System.out.println("返回set集合user中元素个数:" + redisTemplate.opsForSet().size("user"));
}
sorted_set-------opsForZSet()
/**
* 操作 zset
*/
@Test
public void testRedisTemplateZSet() {
// zadd key score column -> 存入分数和名称
redisTemplate.opsForZSet().add("player", "p1", 100);
redisTemplate.opsForZSet().add("player", "p2", 100);
redisTemplate.opsForZSet().add("player", "p3", 100);
redisTemplate.opsForZSet().add("player", "p4", 100);
// zincrby key score column -> 偏移名称对应的分数
redisTemplate.opsForZSet().incrementScore("player", "p2", 500);
// zrange key start end -> 按照分数升序输出名称
System.out.println(redisTemplate.opsForZSet().range("player", 0, -1));
// zrevrange key start end -> 按照分数降序输出名称
Set<ZSetOperations.TypedTuple<String>> playerSet = redisTemplate.opsForZSet().reverseRangeWithScores("player", 0, -1);
Iterator<ZSetOperations.TypedTuple<String>> iterator = playerSet.iterator();
while (iterator.hasNext()) {
ZSetOperations.TypedTuple<String> typedTuple = iterator.next();
Object value = typedTuple.getValue();
double score = typedTuple.getScore();
System.out.println("名称:" + value + " 分数" + score );
}
// zrank key name -> 升序返回排名
System.out.println(redisTemplate.opsForZSet().rank("player", "p2"));
// zrevrank key name -> 降序返回排名
System.out.println(redisTemplate.opsForZSet().reverseRank("player", "p2"));
// zcard key -> 返回元素个数
System.out.println(redisTemplate.opsForZSet().size("player"));
}