springboot+redis
特点
1.高效性
2.支持多种数据结构
String,list,set,hash.zset
3.稳定性:持久化,主从复制(集群)
4.其他特性:支持过期时间,支持事务,消息订阅。
安装
1.下载安装包
redis官网地址:
https://redis.io/ (https://redis.io/)
中文网站
http://www.redis.cn/ (http://www.redis.cn/)
2.解压Redis压缩包完成即安装完毕
3.一些其他配置
启动服务
在redis目录下cmd,输入 redis-server.exe redis.windows.conf
默认端口号
6379
客户端
在redis目录下cmd,输入 redis-cli.exe -h localhost -p 端口号
注册成为服务
在redis目录下cmd,输入 redis-server --service-install redis.windows-service.conf --loglevel verbose
设置密码
在redis.window.conf文件夹下输入,requirepass 123456,redis.window-service.conf要同步修改
登录
在redis目录下cmd,输入 auth 密码
不同数据结构的方法
String
SpringBootTest
class SpringBootRedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;//防止乱码
//存值StringRedisTemplate相当于RedisTemplate<String, String>
@Test
void contextLoads() {
redisTemplate.opsForValue().set("j4061", "张三");
stringRedisTemplate.opsForValue().set("j4062", "张三");
}
//获取值
@Test
void getValue() {
System.out.println(stringRedisTemplate.opsForValue().get("j4061"));
}
//设置过期时间
@Test
void setTimeValue(){
stringRedisTemplate.opsForValue().set("code", "123", 60, SECONDS);
}
//判断是否存在并设置值
@Test
public void setNX(){
//如果有对应的键值,则设置值并返回true,如果没有对应的键值,则返回false
System.out.println(stringRedisTemplate.opsForValue().setIfPresent("j4062", "123"));
//如果有对应的键值,则返回false,如果没有对应的键值,则返回true
System.out.println(stringRedisTemplate.opsForValue().setIfAbsent("j4062", "张三"));
}
hash
@Autowired
private StringRedisTemplate stringRedisTemplate;
//存入hash
@Test
void setHash(){
stringRedisTemplate.opsForHash().put("hash", "key1", "value1");
stringRedisTemplate.opsForHash().put("hash", "key2", "value2");
stringRedisTemplate.opsForHash().put("hash", "key3", "value3");
}
//获取hash
@Test
void getHash(){
System.out.println(stringRedisTemplate.opsForHash().get("hash", "key1"));
System.out.println(stringRedisTemplate.opsForHash().get("hash", "key2"));
System.out.println(stringRedisTemplate.opsForHash().get("hash", "key3"));
}
//获取hash的所有key
@Test
void getHashKeys(){
System.out.println(stringRedisTemplate.opsForHash().keys("hash"));
}
//获取hash的所有value
@Test
void getHashValues(){
System.out.println(stringRedisTemplate.opsForHash().values("hash"));
}
//获取hash的所有entry
@Test
void getHashEntries(){
System.out.println(stringRedisTemplate.opsForHash().entries("hash"));
}
//删除hash
@Test
void deleteHash(){
stringRedisTemplate.opsForHash().delete("hash", "key1");
System.out.println(stringRedisTemplate.opsForHash().get("hash", "key1"));
}
//判断hash中是否存在key
@Test
void hasKey(){
System.out.println(stringRedisTemplate.opsForHash().hasKey("hash", "key1"));
System.out.println(stringRedisTemplate.opsForHash().hasKey("hash", "key2"));
System.out.println(stringRedisTemplate.opsForHash().hasKey("hash", "key3"));
}
list
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添
加一个元素到列表的头部(左边)或者尾部(右边)
public class TestList {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void setList(){
//一次添加一个元素
stringRedisTemplate.opsForList().leftPush("fruits", "pear");
//一次添加多个元素
stringRedisTemplate.opsForList().leftPushAll("fruits", "apple", "banana", "orange");
//在头部添加元素
stringRedisTemplate.opsForList().leftPush("fruits", "grape");
//在尾部添加元素
stringRedisTemplate.opsForList().rightPush("fruits", "watermelon");
//获取列表长度
System.out.println(stringRedisTemplate.opsForList().size("长度"+"fruits"));
//获取列表中所有元素
System.out.println(stringRedisTemplate.opsForList().range("fruits", 0, -1));
//获取列表中指定位置的元素
System.out.println(stringRedisTemplate.opsForList().index("fruits", 2));
//删除列表中指定位置的元素,如果列表中有多个 "banana",只会删除第一个
stringRedisTemplate.opsForList().remove("fruits", 1, "banana");
//获取列表中指定元素的索引
System.out.println(stringRedisTemplate.opsForList().indexOf("fruits", "orange"));
}
}
set
1.Redis 的 Set 是 String 类型的无序集合。集合成员是
唯一的,这就意味着集合中不能出现重复的数据
2.Redis 中集合是通过哈希表实现的,所以添加,删
除,查找的复杂度都是 O(1)。
@SpringBootTest
public class TestSet {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void setSet(){
// 添加元素到set,可以添加多个元素,返回添加成功的个数
stringRedisTemplate.opsForSet().add("students","张三","李四","王五");
}
@Test
void getSet(){
// 获取set中的所有元素
Set<String> set = stringRedisTemplate.opsForSet().members("students");
for (String s : set){
System.out.println(s);
}
}
@Test
void removeSet(){
// 从set中移除元素
stringRedisTemplate.opsForSet().remove("students", "张三");
}
@Test
void sizeSet(){
// 获取set的大小
Set<String> set = stringRedisTemplate.opsForSet().members("students");
}
@Test
void containSet(){
// 判断元素是否在set中
boolean b = stringRedisTemplate.opsForSet().isMember("students", "张三");
System.out.println(b);
}
}
zset
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,它用来保存需要排序的数据,例如排行榜
@SpringBootTest
public class TestZset {
@Autowired
private StringRedisTemplate stringRedisTemplate;
//存值
@Test
void setZset() {
stringRedisTemplate.opsForZSet().add("top", "a", 1);
stringRedisTemplate.opsForZSet().add("top", "b", 3);
stringRedisTemplate.opsForZSet().add("top", "c", 2);
(stringRedisTemplate.opsForZSet().range("top", 0, -1)).forEach(System.out::println);
}
//取所有值
@Test
void getZset() {
//正序
System.out.println(stringRedisTemplate.opsForZSet().range("top", 0, -1));
//倒序
System.out.println(stringRedisTemplate.opsForZSet().reverseRange("top", 0, -1));
}
//获取前两个值,下标从1开始
@Test
void getZsetByScore() {
System.out.println(stringRedisTemplate.opsForZSet().rangeByScore("top", 1, 2));
}
//获取排名第2的元素,下标从0开始
@Test
void getZsetByRank() {
System.out.println(stringRedisTemplate.opsForZSet().reverseRank("top", "b"));
}
//获取值和权重
@Test
void getZsetByScoreWithScores() {
//第一种方式
System.out.println(stringRedisTemplate.opsForZSet().rangeWithScores("top", 0, -1));
//第二种方式
Cursor< ZSetOperations.TypedTuple<String>> scan = stringRedisTemplate.opsForZSet().scan("top", ScanOptions.NONE);
while (scan.hasNext()) {
ZSetOperations.TypedTuple<String> next = scan.next();
System.out.println(next.getValue() + "----" + next.getScore());
}
}
//删除值
@Test
void delZset() {
stringRedisTemplate.opsForZSet().remove("top", "a");
System.out.println(stringRedisTemplate.opsForZSet().range("top", 0, -1));
}
}