作者:男孩艹艹 | 来源:互联网 | 2023-06-12 20:51
1、NoSql介绍2、Redis概述3、Redis安装4、Redis性能测试工具5、Redis基础知识6、Redis五个基础数据类型1、NoSql介绍NoSql四大分类
1、NoSql介绍
2、Redis概述
3、Redis安装
4、Redis性能测试工具
5、Redis基础知识
6、Redis五个基础数据类型
1、NoSql介绍
NoSql四大分类:
KV键值对:
- 新浪:Redis
- 阿里、百度:Redis+memcache
文档型数据库(Bson格式和Json一样):
- MongoDB
- 基于分布式文件存储的数据库,C++编写,主要存储大量的文档;
- 介于非关系型数据和关系型数据库的中间产品,mongoDB是非关系型数据库中功能最丰富的,最像关系型数据库的非关系型数据库。
- CouchDB
列存储数据库
- Hbase
- 分布式文件系统
图关系数据库(不是存图形的,放的是关系比如:朋友圈社交网络,广告推荐)
- Neo4j
- InfoGrid
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/7122c0989b49d7b2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
2、Redis概述
www.redis.cn
1、Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2、Redis作用
- 内存存储、可以持久化(rdb、aof)
- 效率高,可以高速缓存
- 发布订阅系统(简单消息功能)
- 地图信息分析
- 计时器、计数器(页面浏览量等)
- 等等
3、特性
- 数据类型多样
- 持久化
- 集群
- 事务
- 等等
默认端口6379的由来:redis作者当时特别喜欢一个女明星,然后她的名字对应九宫格的数字是6379。
3、Linux下Redis安装
直接拿官网最新版:https://redis.io/
然后丢到linux上
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/db310663e7e6810a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
解压
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/39343c58b15a8ae0.png)
4、Redis性能测试工具
redis-benchmark 官方自带压力测试工具
redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 10000
命令 菜鸟截图:
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/6d914877ffe0ee0f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
结果分析:
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/e661605cf8b29abe.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
5、Redis基础知识
Redis默认有16个数据库,默认使用第0个数据库。
![在这里插入图片描述](https://img8.php1.cn/3cdc5/127d4/b64/83a19a6f446369b2.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
select切换数据库命令
#切换数据库到第四个
select 3
keys查看全部key的命令
#查看全部都key
keys *
flushdb清空当前数据库命令
flushdb
flushall清空全部数据库命令
flushall
exists是否存在命令
exists key
move移动key命令
将key移动到数据库1号
move key 1
expire设置key时效
expire key 10
设置key十秒后过期
ttl查看key的剩余时间
ttl key
type查看数据类型
type key
Redis单线程
官方表示,Redis是基于内存操作,cpu不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了。
数据直接存储在内存上,操作数据速度非常快,无需使用多线程导致cpu指针的切换造成不必要的资源损失。
6、Redis五个基础数据类型
String
append追加命令
append key "hello"
在key的值末尾添加 hello
如果当前key不存在,则新建这个key(相当于set)
strlen查询值的长度
strlen key
incr加一命令
incr key
给key的值加一
decr减一命令
decr key
给key的值减一
incrby增加步长,指定增量
incryby key 10
加10
decrby减少步长,指定增量
decrby key 10
减10
getrange获取字符串指定索引区间的值
getrange key 0 3
获取key值从0到3位置的值
getrange key 0 -1
获取key值的全部字符串
setrange把某个位置的值替换成新的值
setrange key 1 xx
将key值从指定位置开始,替换为新的值
setex设置过期时间命令
set with expire
setex key 30 "hello "
设置key,值为hello,30秒后过期
setnx如果不存在则执行set
set if not exist
```setnx key “world”````如果key不存在则存入key,值为world,如果存在,则不操作
(设置分布式锁时常用)
mset批量设置值
mset key1 val1 key2 val2
存入key1和key2,值分别为val1和val2
mget批量获取值
mget key1 key2
同事获取key1和key2的值
msetnx批量设置
原子性,只有同时成功,或者同时失败,不会部分存入部分不存入。
对象操作思想
设置一个key为user,值为json格式的数据保存用户信息
set user {name:xiaoming,age:3}
这样做不便于解析,应使用:
mset user:name xiaoming user:age 3
getset命令
先执行get,在执行set,若不存在则返回null
getset key 123
返回key原来的值,并将key的值设置为123
String类似的使用场景:value除了是存储字符串之外还可以是数字;
List
- 在redis里面,可以吧list设置成栈、队列、阻塞队列;
- 数据可以重复;
所有的list命令,都是以 “l” 开头。
lpush存入命令
存入时的顺序是 one two three,而取出时的顺序是 three two one,先进后出FILO
![](https://img8.php1.cn/3cdc5/127d4/b64/5c58354fef1dc66f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxODQ1NDg0MjM2,size_16,color_FFFFFF,t_70)
rpush存入命令
将数据存入list的末尾,最后一个位置
rpush list four
lrange获取列表对应位置的值
lrange list 0 3
第0位置到第3位置
lpop移除列表第一个元素
lpop list
移除list的左边第一个值
rpop移除列表最后一个元素
rpop list
移除list的最右边最后一个元素
lindex通过下标获取值
lindex list 0
获取第0个位置的值
llen获取长度
llen list
lrem移除指定个数的值
lrem list 2 one
移除list中的 两个 one值
ltrim截取指定位置区间的值
ltrim list 1 2
截取从1到2位置的值,覆盖原来的值,保留截取后的值
rpoplpush移除最后一个元素加入另一个list的第一个位置
rpoplpush list1 list2
将list1的最后一个值删除,并在list的第一个位置插入这个值
lset给列表指定位置替换/设置 值
lset list 1 val
给list的1下标位置的值,替换为“val”
若list的1位置没有值,则会报错:不存在
linsert给list指定位置的插入一个值
linsert list before val1 val2
指的是在值为val1的位置 前 插入值:val2
linsert list afterval1 val2
指的是在值为val1的位置 后 插入值:val2
小结:
可以想象成链表结构,有各种变化,可以从左边插入、右边插入或改动,但从中间操作元素效率相对较低;
简单的消息队列:Lpush Rpop
栈:Lpush Lpop