面试整理-redis基础

目录

一、redis介绍

二、5种基本数据类型

三、3种特殊数据类型

四、redis事务

五、redis监控实现乐观锁

六、狂神说redis笔记传送门


一、redis介绍

redis为什么快,因为是单线程的,没有多线程的CPU上下文切换,是基于内存操作的

redis默认有16个数据库,默认使用的是第0个

select n 切换到弟n个数据库

dbsize 查看当前数据库大小

keys * 查看当前数据库中所有的key 

exists key 判断当前数据库该key是否存在

del key 删除当前数据库该key的键值对

flushdb 清空当前数据库中所有的键值对

flashall 清空所有数据库中的键值对


二、5种基本数据类型

1. String

value除了是字符串还可以是数字

主要命令:

set 设置值;get 获取值;

setex key timeout value 设置key的并设置过期时间;setnx key 不存在key再设置(用于分布式锁);

incr/decr key 对key自增/减1; incrby key 10 对key自增10;decrby key 10 对key自减10;

getrange key m n 截取[m,n]字符串;getrange key 0 -1 获取全部字符串;

......

使用场景:

1. 计数器;2. 粉丝数;3. 对象缓存存储(需要把对象格式化成json键值对)

......

2. List;

list实际上是一个链表,可以进行双端操作的,可以用来做栈(先进后出)、队列(先进先出);

主要命令:

lpush key value 插入值;rpush key value 插入value值到key的最右端;

lrange key 0 2 取出[0,2]的元素(像栈);lrange key 0 -1取出key中的所有值;

lpop key从左侧头部弹出;rpop key 从右侧头部弹出;         

......

小结:

1. 如果key不存在,则创建新的链表;存在,则新增内容;

2. 一处所有元素,空链表也代表不存在;

3. 在两边插入或改动,效率高,中间元素,效率相对低;

使用场景:消息队列,栈

3. Set

set是string类型的无序不重复集合,是通过hash表实现的。所以添加、删除、查找的时间复杂度是O(1)。

主要命令:

sadd key value;往集合key中添加值;smembers key 获取集合key中全部的元素

sinter/sunion key1 key2 ... keyn 求key1 key2 ... keyn的交/并集;  

......

4. Hash

hash是string类型的key value的映射表。相当于map集合,reids<key,  map<key ,value>>

主要命令:

hset key k1 v1... kn vn 设置key的value值k1 v1... kn vn(kv键值对);

hset key k1 ... kn vn 获取key中的k1 v1... kn vn;

hgetall key 获取key中所有的value((kv键值对));

...

hset student1 name Jorry

hset student1 age 18

...

hgetall student1 获取student1的全部信息(k,v键值对)

hincby student1 age 2 给student1的学生age字段+2

...

经常变更的信息,用户类数据信息,hash更适合对象存储,string更适合字符串存储;

5. Zset

有序集合

三、3种特殊数据类型

1. geospatial(地理位置)

使用经纬度地理坐标计算距离,如:附近的人定位

2. hyperloglog(基数统计)

计算数据集中不同元素的个数,如:计算页面方位量(一个用户多次访问算一个人)

3. BitMaps(位图):

使用位存储,信息状态只有0和1,如:状态统计,签到统计

四、redis事务

相比较数据库事务的ACID,redis没有隔离性(i),因此没有隔离级别的概念

redis的单条命令是可以保证原子性的,但是redis的事务不能保证原子性!

redis事务的本质:一组命令的集合,被按顺序序列化,按顺序执行,不允许其他命令干扰

A. 开启事务:multi

B. 命令入队

C. 执行事务:exec

事务出错

1. 代码语法错误(编译时异常:redis错误命令执行报错,如:abcd k1),所以命令都不执行

2. 代码逻辑错误(运行时异常:事务执行时,逻辑错误报错,如:对字符串进行incr key1 ),其他命令可正常执行(所以不能保证原子性)

五、redis监控实现乐观锁

1. 悲观锁,很悲观,认为什么时候都会出问题,所以无论怎样都会加锁,效率低

如:mysql的select ...for update

2. 乐观锁,很乐观,认为什么时候都不会出问题,所以无论怎样都不会加锁,效率高

如:mysq表中加version字段实现悲观锁,更新时,1. 现查version;2. 比较version;3. 一致时更新,否则不更新

redis使用watch key实现监控key,相当于乐观锁加锁

Thread1: set money 100; set use 0; 

Thread1: watch money;multi;decrby money 20;incrby user 20;

Thread2: incrby money 600; 

Thread1: exec(nil)//没有结果说明执行失败          

事务exec执行之前,其他线程修改了值,事务执行失败,需要解锁获取新值后再加锁执行事务

unwatch进行解锁,每次exec执行事务后,都会自动释放锁,不管成功与否

六、狂神说redis笔记传送门

狂神说 Redis笔记_每天进步一點點的博客-CSDN博客_狂神说redis笔记

redis狂神说笔记超详细(总结不易)_想去22世纪的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值