redis必会
1.nosql
非关系型数据库,里面包含redis和mondodb
2.为什么会用到关系型数据库?因为当数据量太多,访问人数过多的时候,在访问关系型数据库时会到硬盘里进行读写过多
这样就会导致访问速度很慢,服务器压力很大。
3.这个时候,我们就可以使用非关系型数据库,它相当于一个缓存区,
把一些经常用的数据放到缓存区里,当用户使用时直接到缓存区中去读取,缓存区找不到再去mysql中拿。
比如12306首页、天猫0点抢购,会把一本分数据放到缓存区里
4.
列表[] ----->支持增删改查,数据类型多样--顺序表
元组() ----->不支持增删改查,只能读
集合{} ----->支持增删改查,元素不重复
字典{} ------>以键值对存储,支持增删改查
面试题:对列表进行去重,可以先将其先转换成集合,在转换回去
a= [1,1,2,2,3,3,]
b = set(a)
a = list(b)
5.redis 是以健命令来进行增删改查的。就根据键来找值,键值对的nosql,即一个健对应一个值,键的类型永远都是字符串,
这个值可以是字符串哈希列表等数据类型。
1)建命令
* keys+正则 查找当下存在的健
* exists key... 判断建是否存在,如果存在返回1,不存在返回0
* type key 查看健对应value的类型
* del key 会将该建以及对应的值都删除
* expire key +seconds 设置时间
* ttl key 查看建存在的时间
2)string
* 最基本的数据类型,最大存储521mb,可以存储二进制的任何数据,图片、数字、系列化对象
* set key value 设置一个键值对
* setes key seconds value 设置键值及其过期时间,以s为单位
* mset key value key value 设置多个键值
* get key 通过健获取值
* mget key 获取多个值
* append key value 追加一个值
* strlen key 查看长度
3)hash
* 用于存储对象,对象的格式是键值对(可以理解为存进去一个字典)
* hset key field value 设置单个属性
* hmset key field value key field value 设置多个
* hget key field 获取 该建的属性对应的值 获取多个hmget
* hgetall key 获取该健存储的所有属性所有值。
4)list
* 用与存储一个列表,列表中元素是string,按照插入顺序排序
* lpush key value value 在该健头部添加
* rpush key value value 在改建尾部添加
* linsert key before|after pivot value 在一个元素的左面或者右边添加一个元素,pivot表示索引
* lpop key 从左侧拿并删除
* rpop key 从右侧拿并删除
* lrange key start stop 从列表中按照索引值遍历出响应元素 并不删除
* ltrim key field 裁剪
5)set 无序集合、与列表类似、元素string类型、元素唯一不重复
* sadd key member member 添加元素
* smembers key 获取元素
* scard key 返回元素的个数
* sinter key1 key2 .. 求多个集合的交集
* sdiff key1 key2.. 求多个集合的差集
* sunion key1 key2 .. 求多个集合的合集
* sismember key member 判断一个元素是否在集合中
5)zset ——> sorted set 与set类似,但是是有序,通过score表示权重,根据权重来将元素排序
* zadd key score member score1 member1...
* zrange key start stop 获取有序集合的元素
* zcard 返回元素个数
* zscore key member 查看该元素的权重
6.发布订阅设计模式
设计模式:redis支持消息的发布与订阅,不需要进行主动请求,自动进行信息更新。
客户端订阅服务端,服务端有新消息,不需要客户端请求,直接发过去,长连接。
7.利用redis搭建主从集群,可以实现备份功能
只要改配置文件即可,更改配置文件bind
将一个bind更改为自己ip作为主
另一加slave ip 作为从,可以将主的数据存储备份
特点:
master/slave 角色
master/slave 数据相同
降低 master 读压力在转交从库
问题:
无法保证高可用
没有解决 master 写的压力
8.redis更容易搭建集群,redis可以登陆完善
9.使用过redis做异步队列么,你是怎么用的?有什么缺点?
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
缺点:
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。
能不能生产一次消费多次呢?----发布订阅模式
使用pub/sub主题订阅者模式,可以实现1:n的消息队列。
10.使用过redis分布式锁么,它是怎么实现的?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!
上一篇: jquery实现简单的轮换出现效果实例_jquery
下一篇: 一个有趣的C语言问题