Redis(2)常用命令

发布于:2024-12-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

安装Redis

现在我们安装Redis 5,Redis安装在Linux上面安装,如果想在本机上面安装多个Redis的话,就要使用Docker。

在Ubuntu上面安装:

  1. 切换到root用户
  2. 使用apt命令搜索相关的软件包(apt search redis)
  3. apt install redis。
  4. 通过netstat -anp | grep redis这个指令查看redis是否安装好了。默认端口为6379
  5. 说明只能由当前主机的客户端访问,跨主机访问不了。
  6. 从进入cd /etc/redis进入redis的配置文件。
  7. 通过vim redis.config进行编辑把bind修改成,再把protected mode切换成no
  8. 重启服务器。
  9. 使用redis自带的客户端连接服务器redis-cli
  10. ctrl+d退出客户端。

通过service redis-server status方式进行查看当前的redis状态。

配置文件的定义:一个大的软件里面有很多定制化的功能,我们可以通过开启或者关闭来定制化我们的功能。

Redis客户端

redis也是一个客户端服务器程序。也就是说redis的客户端和服务器之间是通过网络进行通信的,redis客户端和服务器可以在一个主机上,也可以不在一个主机上面。

redis自带了命令行客户端

如果想要使用其他的ip如下使用:

图形化客户端

暂时用不到,redis自带的客户端百分百能连接到我的客户端,但是图形化客户端不一定。可能会经历很多的跳板机。

基于Redis的api自行开发的客户端

后边通过java程序的api调用进行自行开发redis

Redis快:

redis的快是和mysql这种的相比比较快,但是和内存中直接操作变量相比就慢不少。

使用hashmap是直接操作内存,,而redis是通过网络再操作内存。单机系统要不要用得看情况。搞个redis可以独立存储数据,扩展分布式就要用redis。

Redis实战操作

redis服务器和客户端交互:掌握常用的命令。使用redis的文档

Redis文档

Redis最核心的命令


get(根据key取value)

要进入redis-cli命令才能用redis的命令

如果查询了一个不存在的key的话就会得到一nil(和null一个意思)。


set(把key和value存进去)

set方法的key和value都是字符串

对于上述的key和value不需要加上引号,就是表示字符串的类型,并且redis中的命令不区分大小写,redis可以就当作一个哈希表使用。


keys:看看有哪些key

pattern匹配

  1. ?是匹配任意字符。                                            
  2. *匹配任意0个或者多个字符。                               
  3. [ae]表示匹配a或者e(给出固定选项)  。             
  4. [^e]表示不匹配e这个字符,只要不是e都行。
  5. [a~e]a到e都可以,abcde都可以。         

注意事项:keys命令时间复杂度是o(n),要遍历所有的o(n),在生产环境上静止使用特别是keys *,查询redis中所有的key,redis实际上执行命令只是单线程,导致执行keys时间很长,导致redis被阻塞。

Redis经常用作缓存,是替mysql负重前行的人,如果redis被阻塞了,其他访问数据库的线程就会直接访问mysql。mysql由于一大堆请求过来容易挂掉。


exists:判断key是否存在

返回值是key存在的个数(针对多个key)。o(1)复杂度。

redis组织key的形式是以哈希表的形式。哈希表查询的复杂度是o(1)。

redis支持很多数据结构,就是value有很多数据结构。

通过exists加上key的形式看有几个value。

封装和分用:

进行网络通信要经历应用层到物理层层次层封装(类似于装快递),接收方要从物理层层层分用(类似于收快递拆快递)。

客户端和服务器不在一个主机上,可能隔着比较远,那么客户端发起的redis请求 。所以redis尽量一次命令操作多个key。


del(delete删除指定的key)

可以删除一个或者多个,可以存在可能不存在,时间复杂度是o(1)。他的返回值也是删除的个数。删除成功几个返回几个。redis中的del相比mysql中的删除危险性少了很多,redis实际上经常是作为缓存,redis只是存一个热点数据,在mysql中也存了一份。

但是不要全删了,会导致数据库的访问量剧增。


EXPIRE(秒)(给指定的key设定过期时间)

此时设置的key要对已经存在的key进行设置

此时等待过期之后就发现没有了。

key的存活时间超过指定时间会被删除(手机验证码),验证码超过多久就失效,生成验证码的时候同时设定过期时间,存储在redis中,如果超过的话就删去。

基于redis实现分布式锁,使用的时候,避免出现不能正确解锁的时候,就在加锁的时候进行加上一个过期时间,即使出现极端情况,过期删去key value的时候就相当于被解锁了。


ttl(time to live)

pttl和ttl一样

查看当前key的过期时间还剩下多少        

当返回-1的时候代表没有设置过期时间,-2表示key不存在。


type

返回key所对应的value的类型,比如这里的lpush左侧插入key6一个数组111,222,这时候返回的type类型就行list。时间复杂度o(1)。 


生产环境(线上环境):

未来在工作中会遇到的几个环境 

开发环境:直接在我的笔记本上面开发,有可能在服务器。

测试环境:实际上和开发环境差不多,也可能在服务器。

线上环境:外界用户能访问到的,线上挂了,一定会对用户访问产生问题。               

redis针对key的过期策略如何实现(面试题):

一个redis中存在很多key,很多都有过期时间,redis怎么知道哪些要过期被删除,哪些不用被删除。key很多的话,遍历所有的key就不合适。

定期删除:

每次抽取一部分进行验证过期,保证抽取检查过程足够快。

redis是一个单线程,主要的任务都是在主线程之中完成,如果抽取检查的时间太长了,那么处理命令的就会被阻塞了。

惰性删除:

假设key已经到时间了,但是暂时还没删除,紧接着后面有一次访问,发现key过期了,所以这次访问就会使得redis触发删除,同时返回空值。

redis为了对定期删除删除不干净,还使用了一系列的内存淘汰机制。

强制删除(内存淘汰机制):

如果redis使用的内存已经达到maxmemory配置的值时,会触发强制清理策略。

定时器(拓展,redis都没有采取)

基于优先级队列(按照指定的优先级)

在redis中就可以通过过期时间越早,优先级越高,很多的key都设置了时间,过期时间早,就先出任务。此时就要扫描队首元素。扫描的时候不可能一直使用while,不然就会忙等,等待队首时间快到了,就进行唤醒。如果有一个新的任务的话,就唤醒一下刚刚的线程,重现检查一下队首元素,再根据时间差距调整阻塞时间。

基于时间轮

把时间轮划分成很多小段 ,每次到时间就会滚到响应的时间尝试执行,进行循环放置。到时间了就放置,没到时间就循环放置。如果时间太长,就会一圈一圈循环,直到找到。