redis学习补充笔记


江南一点雨网站:http://itboyhub.com/
使用虚拟机安装Ubuntu16.04,并编译安装redis成功。
编译安装后,将控制台占住了
修改配置文件,

vi redis.conf
redis-server redis.conf#启动redis
redis-cli -a 123#进入代理区

第二章 基本数据类型
String
List
Set
Hash
ZSet
不止这5个,这五个是基础。
1.String
String是redis中最简单的数据结构。在redis中,所有的key都是字符串。不同的key对应的value具有不同的数据结构,我们所说的五种不同的数据类型,主要是指value的数据类型不同。
redis中的字符串是动态字符串,内部是可以修改的,像StringBuffer,StringBuilder,采用分配荣誉空间的方式减少内存的频繁分配。
在redis内部结构中,一般实际分配的内存会大于需要的内存,当字符串<1M时,都是在现有的空闲基础上加倍。扩容每次扩1M,最大512M。

  • append

    ttl 查看有效期
    单位为秒s

2.List

开启Redis,使用Jedis连接

在这里插入图片描述

redis的安装路径在根目录下
在Xshell中,

cd redis-6.2.5/
redis-server redis.conf  #启动redis
redis-cli -a 123 #即可使用命令行的方法操作redis中的数据了

try-with-resource is not support in language level 5

File->Project Structure->Module->language level调到7以上就可以了。
执行又出现了错误:
Error:java: Compilation failed: internal java compiler error 解决办法:
https://blog.csdn.net/wo541075754/article/details/82119860
我在pom.xml文件中,添加了,就好了。

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
try-with-resource
public class MyJedis02 {


    public static void main(String[] args) {
        //获取一个连接池对象
        JedisPool pool = new JedisPool("192.168.68.128",6379);
        //从连接池中获取一个个Jedis连接
        try(Jedis jedis = pool.getResource()){
            jedis.auth("123456");
            String ping = jedis.ping("hello");
            System.out.println(ping);
        }
    }
}

lambda语法糖

https://www.cnblogs.com/JonnyJiang-zh/p/13702842.html

public interface interfaceCallWithJedis {
    void call(Jedis jedis);
}

分布式锁

setnx key value命令
NX not exists
如果不存在key,则设置value的值
该值不会被覆盖。
在这里插入图片描述

public class MyJedis03 {
    private JedisPool pool;
    public MyJedis03(){
        GenericObjectPoolConfig config = new GenericObjectPoolConfig();//连接池最大空闲数
        config.setMaxIdle(300);//最大连接数
        config.setMaxTotal(1000);
        //连接最大等待时间,如果是 -1 表示没有限制         
        config.setMaxWaitMillis(30000);
        // 在空闲时检查有效性
        config.setTestOnBorrow(true);
        pool = new JedisPool(config, "192.168.68.128", 6379, 30000, "123456");
    }
    public void execute(interfaceCallWithJedis callwithjedis){
        try(Jedis jedis2 = pool.getResource()){
            callwithjedis.call(jedis2);
        }
    }

    public static void main(String[] args) {
        MyJedis03 redis = new MyJedis03();
        redis.execute(jedis04 -> {System.out.println(jedis04.ping());});
    }
}

延迟消息队列
使用zset,使用时间作为score,将value存入redis中,通过轮询的方式,不断的读取消息。
如果消息是String类型,直接传输即可,如果是Hash,List,set,zet,需要将对象序列化,之后当作字符串传输。

Bit操作

get/set
getbit
setbit
bitcount key start end,start和end是字符的索引而不是01的索引
bitpos用来统计在指定范围内出现的第一个1或者0的位置,这个命令中的其实和结束位置都是字符索引而不是bit索引,一定要注意。
8.4 Bit批处理
在redis3.2之后新加的功能叫做bitfield,
bitfield name get u4 0
表示获取name中的位,从0开始获取,获取4个位,返回一个无符号数字。

-u表示无符号数字
-i表示有符号数字,有符号的第一个符号就是符号位,1表示是一个负数。

布隆过滤器Bloom Filter

查询到不存在,则一定不存在;查询到存在,可能不存在。用户可能错过某条信息。
相当于一个不太精确的set集合,可利用里面的contains方法判断某个信息是否存在。

bloom过滤器
每一个布隆过滤器,在redis中都对应了一个大型的位数组以及几个不同的hash函数。

b=布隆过滤器和redis并不是绑定的,它的思想可以用于任何地方,用任何语言实现。

缓存击穿
雪崩效应是什么意思?

Redis中的key是一维数组+链表的形式。cursor指的是一维数组的槽的位置,limit则是遍历的一维数组槽位数,所以每次返回的数组大小不确定

SCAN

Redis中字典(Dictionary)的实现:https://blog.csdn.net/belalds/article/details/92806223
Redis中好玩的算法-高位进位法:https://blog.csdn.net/u014439693/article/details/108325632
Redis的淘汰机制LRU
因为Redis是基于内存的,当Redis所使用的内存超过物理内存限制的时候,内存中的数据会和磁盘数据发生频繁的交换,这种交换会降低redis的性能。

Redis淘汰策略

当redis实际内存超过系统可用内存之后,Redis提供几种策略:
1.noeviction:默认的策略,此时写操作将停止,删除和读取可以进行。
2.volatile-lru:淘汰设置了过期时间的key,最近最少使用的key会被淘汰,如果一个key没有设置过期时间,则不会被淘汰。
3.volatile-ttl:淘汰设置了过期时间的key,根据key的ttl值,ttl越小,越优先淘汰,如果一个key没有设置过期时间,则不会被淘汰。
4.volatile-random:淘汰设置了过期时间的key,随意移除设置了过期时间的key,如果一个key没有设置过期时间,则不会被淘汰。
5.allkeys-lru:淘汰所有的key,最近最少使用的key会被淘汰。
6.allkeys-random:淘汰所有的key,随机淘汰。

lazy free
Redis是单线程的,如果直接删除一个很大的key,可能会造成卡顿。
异步删除
命令:unlink key
flushall async 异步删除
flushdb async

6.ssl
加密通信
软件spiped

第五章 深入理解redis

NIO 非阻塞IO
阻塞IO和非阻塞IO的区别:
如果你从数据流中读取不到指定大小的数据流,IO就会阻塞。

Redis是单线程的,单线程如何解决高并发问题的?
实际上,能够处理高并发的线程应用不仅是Redis,除了Redis外,还有NodeJS,Nginx等也是单线程。
Redis虽然也是单线程,但是运行很快,主要有一下几个方面:
1.所有数据都是放在内存的,计算也都是内存级别的计算,比较快。
2.redis是单线程的,所以有一些时间复杂度比较高的指令,比如keys,会出现卡顿。
3.Redis在处理并发的客户端连接时,使用了非阻塞IO。
在使用非阻塞IO时,有一个问题就是线程如何知道剩下的数据来了?
涉及到一个新的概念多路复用,本质就是一个事件轮询API。看

Java NIO

4.Redis会给每一个客户端套接字Socket指定一个指令队列,指令通过队列来排队进行顺序处理。
5.Redis也有一个响应队列,将响应结果通过队列,将指令结果返回给客户端。
Redis

RDB恢复快,保存的数据没有AOF完整,比较适合数据库

watch money
监控money,如果money改变了,那么在事务执行过程中,事务就会执行失败。

Redis分布式系统

CAP
一致性consistency
可用性availability
分布式容忍性Partition tolerance
redis要保证最终一致性。

从机连接主机失败的话,需要配置redis.conf中的masterauth 123456,即配置主机密码。
复制原理
master每向slave发送一条数据之后,偏移量offset就会加一
哨兵模式
sentinel.conf
一个master down了,新推选出的slaver如何变成master

masterauth
bind
Intellij IDEA 2019无法联网,无法下载插件问题解决办法:https://blog.csdn.net/hanxue6898/article/details/96508529
IntelliJ IDEA 开发 Spring 的常用插件

https://blog.csdn.net/chy555chy/article/details/86148293?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EsearchFromBaidu%7Edefault-1.pc_relevant_baidujshouduan&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EsearchFromBaidu%7Edefault-1.pc_relevant_baidujshouduan
在这里插入图片描述
在这里插入图片描述

从redis5开始,推出了redis stream

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值