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">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>redis.clients<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jedis<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</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>));

}


返回课程体系