Redis
1. 介绍
1.1.NoSQl
non-relational -> no only SQL
: 非关系型数据库
内存级别的数据库
1.2. 分类
Redis:键值对
HBase:列存储
MongDb:文档类型存储
Neo4J:图形数据库
1.3. 特点
仍旧是单线程
ACID 处理比较简单
2. 使用
2.1. 安装
cmd
添加到环境变量
开启服务
客户端
一般公司都使用第一个数据库
3. 指令
3.1.String 类型
set key value
get key
incr key // 没有的话自动创建变量并加一
decr key // 没有的话自动创建变量并减一
del key
setnx key value // 直接 set 的话会覆盖
setex key timeout value
ttl key
应用场景
- 点赞;正在观看的人数
- 共享 Session
3.2.hash 指令
hset 对象 字段 值
hget 对象 字段
hexists 对象 字段 // 是否有这个键
hdel 对象 字段 // 删除字段
hincrby 对象 字段 值
hlen 对象 // 获取键数量
hkeys 对象 // 获取所有键
hvals 对象 // 获取所有值
hgetall 对象 // 获取所有键值对
引用场景:
和 String 一样也是共享 Session, 前者是方便查询,后者是方便修改
3.3.list 指令
类似队列或栈
lpush 对象 值
rpush 对象 值
rpop 对象
lpop 对象
lrange 对象 start end // 显示范围数据 0 -1: 可以列出所有数据,因为最后的数据是 -1
llen 对象 // 获取对象长度
可选
linsert key before/after refVal newVal -> 参考值之前/后插入数据
lset key index value -> 根据索引修改数据
lrem key count value -> 在列表中按照个数删除数据
ltrim key start end -> 范围截取列表
lindex key index -> 根据索引取列表中数据
引用场景:
list 相同或者相似的多个数据
3.4.set 指令
sadd key value -> 往set集合中添加元素
smembers key -> 列出set集合中的元素
srem key value -> 删除set集合中的元素
spop key count -> 随机弹出集合中的元素
sdiff key1 key2 -> 返回 key1 中特有元素 (差集) // 保留左边的
sinter key1 key2 -> 返回两个 set 集合交集
sunion key1 key2 -> 返回两个 set 集合的并集 // 不知道这个并集有没有包括交集
scard key -> 返回 set 集合中元素个数
可选:
sdiffstore var key1 key2 -> 返回 key1 中特有元素存入另一个 set 集合
sinterstore var key1 key2 -> 返回两个 set 集合的交集存入另一个 set 集合
sunionstore var key1 key2 -> 返回两个 set 集合的并集存入另一个 set 集合
smove key1 key2 value -> 把key1中的某元素移入key2中
sismember key value -> 判断集合是否包含某个值
srandmember key count -> 随机获取set集合中元素
应用场景
抽奖、去重、社交共同
3.5.sorted_set 类型
实时排序
zadd key score column -> 存入分数和名称
zincrby key score column -> 偏移名称对应的分数 // 增加
zrange key start end -> 按照分数升序输出名称
zrevrange key start end -> 按照分数降序输出名称
zrank key name -> 升序返回排名 // 从零开始算
zrevrank key name -> 降序返回排名
zcard key -> 返回元素个数
3.6. 总结
排序使用 zset
可重复使用 list
不可重复使用 set
多个键值对使用 hash
键值对使用 String
key 值需要见名知意
4. 其他
4.1. 全局
keys *:列出所有指令
exists:是否存在
expires:设置过期时间,可以使用 ttl 查询过期时间
persist:取消过期时间
flushdb:清空数据库
4.2. 密码
redis.windows-service.conf 文件,执行命令后需要重启服务
下次登录 redis-cli -a [密码]
# requirepass foobared
4.3. 事务
multi 开启,exec 结束
redis 的事务只是打包执行一堆脚本,不算 mysql 当中的事务
4.4. 持久化
RDB:快照
save 900 1 //900 秒内有一个发生改变则执行
save 60 10000
AOF:收集 write 函数追加到命令中
appendfsync always:一直
appendfsync everysec:折中
appendfsync no:根据系统
4.5. 内存淘汰
默认报错
LRU:淘汰最远的
LFU:淘汰使用频率低的
TTL:找寻最快过期的
随机淘汰
4.6. 过期 key 处理
惰性删除:访问才删除,会造成内存浪费
定时删除:方式不太友好
定期删除:某个时间段清理数据
5.java 操作
5.1.jedis
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>
</parent>
<span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>redis.clients<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>jedis<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-name">scope</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span>
指令
@Test
public void testJedisPool() {
// 1: 创建 Jedis 连接池
JedisPool pool = new JedisPool("localhost", 6379);
// 2: 从连接池中获取 Jedis 对象
Jedis jedis = pool.getResource();
<span class="hljs-comment">// 3:TODO</span>
<span class="hljs-comment">//redis命令分别对应jedis的方法</span>
jedis.set(<span class="hljs-string">"namemm"</span>,<span class="hljs-string">"wuyupeng"</span>);
<span class="hljs-comment">// 4:关闭资源</span>
jedis.close();
pool.destroy();
}
5.2.springboot
底层是 lettuce
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件
spring.redis.host=127.0.0.1
spring.redis.port=6379
#spring.redis.password=admin // 密码可以不要
指令
//@Autowired
//private RedisTemplate xx;
// 弄完配置后自动创建对象
@Autowired
private StringRedisTemplate redisTemplate;
@Test
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">test</span>()</span> {
<span class="hljs-comment">//redisTemplate.opsForValue();//操作字符串</span>
<span class="hljs-comment">//redisTemplate.opsForHash();//操作hash</span>
<span class="hljs-comment">//redisTemplate.opsForList();//操作list</span>
<span class="hljs-comment">//redisTemplate.opsForSet();//操作set</span>
<span class="hljs-comment">//redisTemplate.opsForZSet();//操作有序set</span>
<span class="hljs-comment">//全局命令直接使用redisTemplate对象</span>
redisTemplate.opsForValue().<span class="hljs-keyword">set</span>(<span class="hljs-string">"hello"</span>,<span class="hljs-string">"xiaoming"</span>);
System.<span class="hljs-keyword">out</span>.println(redisTemplate.opsForValue().<span class="hljs-keyword">get</span>(<span class="hljs-string">"hello"</span>));
}