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>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

指令

@Test
    public void testJedisPool() {
        // 1:创建Jedis连接池
        JedisPool pool = new JedisPool("localhost", 6379);
        // 2:从连接池中获取Jedis对象
        Jedis jedis = pool.getResource();

        // 3:TODO
        //redis命令分别对应jedis的方法
        jedis.set("namemm","wuyupeng");

        // 4:关闭资源
        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
    public void test() {
        //redisTemplate.opsForValue();//操作字符串
        //redisTemplate.opsForHash();//操作hash
        //redisTemplate.opsForList();//操作list
        //redisTemplate.opsForSet();//操作set
        //redisTemplate.opsForZSet();//操作有序set
        //全局命令直接使用redisTemplate对象

        redisTemplate.opsForValue().set("hello","xiaoming");
        System.out.println(redisTemplate.opsForValue().get("hello"));

    }


返回课程体系

posted @ 2021-06-18 09:32  LinkYup  阅读(44)  评论(0编辑  收藏  举报