Redis
Redis(Remote Dictionary Server ),即远程字典服务
1先解压redis安装包
tar -zxvf redis-6.0.9.tar.gz
2先安装c++运行环境(redis是用c语言写的)
yum install gcc-c++
进入解压后的redis目录
make #进行编译(对应redis目录下的makefile文件)
make install #(低版本的gcc可能会报错)进行安装
可升级gcc的版本
3.redis默认被安装在/usr/local/bin目录下
默认安装后的文件有五个 其中
redis-server: 表示redis服务端 在当前目录下 ./redis-server
可打开默认配置的服务
redis-cli: 表示redis客户端
./redis-cli -h localhost -p 6379
可连接redis服务端
./redis-cli -h localhost -p 6379 --raw
这样存储中文终端可以显示中文
4.指定配置文件方式让server启动
cd /opt/redis-6.0.9
进入解压后的源码文件
cp redis.conf /usr/local/bin
复制配置文件到redis安装目录然后指定配置文件方式启动redis服务 可以修改配置文件进而修改默认配置
./redis-server redis.conf
5.可编辑默认redis.conf配置文件
vim redis.conf
修改默认端口号:
允许远程访问
将bind 127.0.0.1 改成 0.0.0.0
6.redis中库的概念
默认有16个数据库(如果不满意可以到redis.conf下修改):
库的编号0-15 默认使用0号库
切换数据库命令: select dbid(0-15)
7.redis基本命令
select dbid(0-15)
切换数据库
set key value
储存某个键值对
get key
获取某个键的值
keys *
查看所有的键
flushdb
清除当前库的数据
Flushall
清空所有库的数据
del key1 key2
删除指定的键值对,可以同时删除多个
exists key
判断键是否存在
expire age 5
给某个存在的键加有效时间
ttl key
查看某个key的有效时间 返回-1代表永久 -2代表已过期 正数代表 有效时间
rename key key1
为某个key改名值不变
type key
显示某个键的值的类型
8.操作string类型
9.操作list类型
10.操作set类型
11.hash类型
key(string) value(map)
2.操作命令
hset KEY key value
eg: hset map1 name zhangsan
存值
hget KEY key
eg: hget map1 name
取值
hgetall key
eg: hgetall map1
遍历map集合中的所有值
hdel KEY key
eg: hdel map1 name
删除某个map集合中的某个值
12.持久化机制
1.快照持久化
默认情况自动开启快照rdb方式
2.AOF持久化
需要改配置文件才能开启AOF持久化
修改配置文件
*当快照(rdb)模式与AOF模式同时开启时 系统默认选择AOF模式
**
13.java操作redis
1.java操作redis原生写法
jredis …
2.springboot整合redis
1.pom文件下添加依赖
<!--引入依赖 spring data redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.Springboot配置文件下
###################### redis配置 #####################
spring.redis.host=192.168.198.133
spring.redis.port=6379
#指定操作那个数据库
spring.redis.database=0
3.springboot项目启动后工厂中会自动加载两个对象 redisTemolate 与 stringRedisTemplate
4.操作redis中的key
/**
* 操作redis中key相关的
*/
@Test
public void testKey(){
stringRedisTemplate.delete("name"); // 删除一个key
Boolean hasname = stringRedisTemplate.hasKey("name");// 判断某个key是否 存在
System.out.println(hasname);
Set<String> keys = stringRedisTemplate.keys("*"); // 获取redis中的所有key
System.out.println(keys);
Long time = stringRedisTemplate.getExpire("name"); // 获取key的超时时间 返回-1永不超时 -2表示key不存在 正数表示有效时间
System.out.println(time);
String randomKey = stringRedisTemplate.randomKey(); // 随机的获取redis中的key
System.out.println(randomKey);
// stringRedisTemplate.rename("name","name1"); // 为key改名 如果redis中没有那个key值就会
stringRedisTemplate.move("age",1); // 移动key到指定库
}
5.操作redis中的string类型
/**
* 操作redis中的字符串 opsForValue 实际操作的是redis中的String类型
*/
@Test
public void testString() {
stringRedisTemplate.opsForValue().set("name","coderzpw"); // 简单的设置一个key value
stringRedisTemplate.opsForValue().set("game","王者荣耀",120, TimeUnit.SECONDS); // 设置一个key 超时时间
System.out.println(stringRedisTemplate.opsForValue().get("name"));
stringRedisTemplate.opsForValue().append("name","是一个好人"); // 追加
System.out.println(stringRedisTemplate.opsForValue().get("name"));
stringRedisTemplate.opsForValue().decrement("num"); // 让某个数字自减 强调必须是数字类型
stringRedisTemplate.opsForValue().increment("num"); // 让某个数字自增 强调必须是数字类型
}
6.操作redis中的list类型
/**
* 操作redis中的list类型 opsForList实际就是操作redis的list类型
*/
@Test
public void testList(){
stringRedisTemplate.opsForList().leftPush("names","coderzpw"); // 创建一个列表 并放入一个元素
stringRedisTemplate.opsForList().leftPushAll("names","小张","小陈","小李"); // 创建一个列表 放入多个元素
ArrayList<String> ns = new ArrayList<>();
ns.add("1");
ns.add("2");
ns.add("3");
stringRedisTemplate.opsForList().leftPushAll("nums", ns);// 创建一个列表放入一个集合
List<String> nums = stringRedisTemplate.opsForList().range("nums", 0, -1);// 遍历某个集合列表 获取值
nums.forEach(v-> System.out.println(v));
7.操作redis中的hash类型
/**
* 操作redis中的hash类型 opsForHash 实际操作的就是redis中的hash类型
*/
@Test
public void testHash(){
stringRedisTemplate.opsForHash().put("maps","name","张三"); // 创建一个hash类型 并放入key value
HashMap<String, String> map1 = new HashMap<>();
map1.put("age","21");
map1.put("bir","1999-12-17");
stringRedisTemplate.opsForHash().putAll("maps2",map1); // 创建一个hash类型 一次性放入多个键值对 参数放入一个map集合
stringRedisTemplate.opsForHash().get("maps","name"); // 获取hash中某个key的值
stringRedisTemplate.opsForHash().values("maps"); // 获取所有的value
stringRedisTemplate.opsForHash().keys("maps"); // 获取所有的key
}
- redis操作对象
**
* redis存储对象
*/
@Test
public void testObject(){ // 要存储的对象首先要实现序列化
/**
* redisTemplate 对象中 key 和 value 的序列化方式的是JdkSerializationRedisSerializer
* key:String
* value:Object
* 修改默认key序列化方案 : key StringRedisSerializer
*/
// 修改key的序列化方式 String类型序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 修改hash key的序列化方案
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
User user = new User();
user.setId(1);
user.setName("张三");
user.setAge(21);
redisTemplate.opsForValue().set("user1",user);
System.out.println(redisTemplate.opsForValue().get("user1"));
}
9 当一个key操作多次 我们可以通过绑定操作来简化
/**
* spring data 为了方便我们对redis进行更好的操作 提供了bound api 简化操作
*/
@Test
public void testBound(){
// redisTemplate stringRedisTemplate 讲一个key多次操作进行绑定 对key绑定
/* 1 这种操作比较麻烦 */
stringRedisTemplate.opsForValue().set("name1","coderzpw");
stringRedisTemplate.opsForValue().append("name1","是个好人");
String s = stringRedisTemplate.opsForValue().get("name1");
System.out.println(s);
/* 对字符串类型key进行绑定 后续所有操作都是基于这个key的操作 */
BoundValueOperations<String, String> name2ValueOperations = stringRedisTemplate.boundValueOps("name2");
name2ValueOperations.set("小虎牙");
name2ValueOperations.append("是个好人");
String s1 = name2ValueOperations.get();
System.out.println(s1);
}