初识Redis -远程词典服务器
NoSQL:非关系型数据库
NoSQL:常见
1.Redis:键值对存储,对k和value没那么强的约束,value支持多种不同的数据结构,很丰富
2.document:以json形式存在
特点:
1.NoSQL的存储方式是内存方式,响应比较快
2.键值xing
3.单线程
4.低延迟,速度快:基于内存,io多路复用
5.支持数据持久化(防止断电,数据消失,数据会放到磁盘中)
6.支持主从集群,分片集群
7.多语言客户端
Redis入门
查看Redis是否运行
ps -ef | grep redis
通过相对信息观看是否运行
Redis命令行
命令行客户端:redis-cli
参数:
-h : 指定ip地址,默认本机
-p :连接redis端口
-a : redis的密码
在/usr/local/bin/目录下 输入
redis-cli -h ip地址 -p 端口号 -a 密码
输入ping redis会回复 pong
Redis图形化客户端
通过图形化界面能看到Redis有十六个库(db0-db15)
通过select 数字 来切换库
假设在db0库中存放键值对name-tom1
在db1库中存放键值对name-tom2
使用select 1就可以使用db1号库
get name得到的值就是tom2
Redis数据结构
Redis是k-v的数据库
k值就是key一般是String类型
但是value的值有很多
常见基本类型有
String
Hash
SortedSet
List
Set
Redis通用命令
查看一个命令的具体用法 help 命令
通用命令
KEYS:查看符合模板的所有key
DEL:删除key,可以删除多个key
MSET:加入多个k-v
EXISTS:判断key是否存在
EXPIPE:给一个key设置有效时期,时间到期,会被自动删除
TTL:查看一个key的剩余有效期(-1代表永久有效)
Redis数据类型
String类型:
分为三类
string:字符串
int:整数类型
float:浮点型
底层都是字节数组的形式存储
Hash类型
hash类型,散列,是一个无序字典
hash结构
常见命令:
hset key 属性 值
hget key 属性
hmset:添加多个值
hmget:获取多个k的值
List类型
Redis的List类型与java的LinkedList双向链表类型类似
特点
有序
元素可重复
插入和删除快
查询速度慢
常见命令:
lpush:向左侧插入一个或者多个元素
lpop:一处左侧第一个元素并返回
rpush:向右侧插入一个或者多个元素
rpop:移除右侧第一个元素并返回
lrange:返回角标范围内的元素
blpop和brpop:没有元素的时候等待
Set类型
Redis中的set结构和java中的HashSet类似,可以看做是一个value是空的HashMap
特征:
无序
去重
查找快
基础命令:
sadd:向set添加一个或者多个元素
srem:移除set中指定元素
scard:返回set中元素的个数
sismember:判断一个元素是否存在set中
smembers:获取set中的所有元素
sinter k1 k2:求k1和k2的交集
sdiff k1 k2:求k1和k2的差集
sunion k1 k2:求k1和k2的并集
SortedSet类型
Redis的SortedSet是一个可排序的set集合,和java中的TreeSet类似,但是TreeSet底层是红黑树,而SortedSet是跳表+hash表,SortedSet中每一个元素都带一个score属性,可以对score元素排序,常用于排行榜
特点
可排序
去重
查询快
命令:
zadd:添加元素 如果存在,更新score值
zrem:删除元素
zscore:获取指定的score值
zrank:获取指定元素排名
zcard:获取元素个数
zcount:统计值在给定范围内所有元素的个数
zincrby:让指定元素自增,步长为指定值
zrange:按照score排序后,获取指定排名范围内的元素
zrangebyscore:按照score排序后,获取score范围内的元素
zdiff,zinter,zunion:差集,交集,并集
z后面+rev就是降序
Redis常见命令
set:添加或者修改string键值对
get:根据key取value
mset:添加多个键值对
mget:根据多个key取value
incr:让一个整型的key自增
incrby:让一个整型的key根据指定大小自增
incrbyfloat:让一个浮点类型根据指定大小自增
setnx:添加一个键值对,前提是key不存在
setex:添加一个键值对,制定有效期
Redis的key格式
项目名:业务名:类型:id
Redis的java客户端
jedis
public class jedis_Test {
private Jedis jedis;
@BeforeEach
void setUp(){
jedis = new Jedis("ip地址",6379);
jedis.auth("密码");
jedis.select(0);
}
@Test
void test(){
jedis.set("name","tom");
System.out.println(jedis.get("name"));
}
@AfterEach
void tearDown() {
if (jedis != null){
jedis.close();
}
}
}
SpringDataRedis
1.引入依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置文件
spring:
redis:
data:
host:
port: 6379
password:
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 0
max-wait: 100
3.Java代码
@SpringBootTest
class SpringDataRedisTestApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("name","power");
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
SpringDataRedis提供了RedisTemplate工具类,封装了对Redis的操作
RedisTemplate.opsForValue() 操作String类型数据
RedisTemplate.opsForHash() 操作Hash类型数据
RedisTemplate.opsForList() 操作List类型数据
RedisTemplate.opsForSet 操作Set类型数据
RedisTemplate.opsForZSet 操作SortedSet类型数据
String序列化器
// 自动装配 StringRedisTemplate,用于操作 Redis 中的字符串数据
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 定义 ObjectMapper 实例,用于将对象转换为 JSON 字符串以及将 JSON 字符串转换为对象
private static final ObjectMapper mapper = new ObjectMapper();
// 测试方法,测试将对象转换为 JSON 并存储到 Redis,然后再从 Redis 中读取并转换回对象
@Test
void testObject() throws JsonProcessingException {
// 创建一个 User 对象
User user = new User("小花", 18);
// 使用 ObjectMapper 将 User 对象转换为 JSON 字符串
String json = mapper.writeValueAsString(user);
// 使用 StringRedisTemplate 将 JSON 字符串存储到 Redis 中,键为 "user"
stringRedisTemplate.opsForValue().set("user", json);
// 使用 StringRedisTemplate 从 Redis 中获取键为 "user" 的值,即 JSON 字符串
String userJson = stringRedisTemplate.opsForValue().get("user");
try {
// 使用 ObjectMapper 将从 Redis 中获取的 JSON 字符串转换为 User 对象
User user1 = mapper.readValue(userJson, User.class);
// 打印转换后的 User 对象
System.out.println(user1);
} catch (IOException e) {
// 捕获异常并打印异常信息
e.printStackTrace();
}
}
}