1.为什么要使用NoSql
1.1单机时代
- 数据放不下了
- 数据库索引,一个机器存放不下
- 访问量 一个机器适配不了
1.2 memorycache +mysql+垂直拆分
减轻数据库压力,如果数据不变的话放进缓存中。
因为做一个网站80%情况都是在读,每次操作数据库那么会对数据库造成压力
发展过程:
优化数据库结构和索引-》文件缓存(io)-》memorycache-》
2 Redis(remote dictionary server)概述
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
2.1 redis能干嘛
- 内存持久化,内存断电即失,持久化很重要
- 效率高,可以用于告诉缓存。
- 发布订阅系统。
- 地图信息分析
- 计时器计数器。
2.2 特性
多样的数据类型
- 持久化
- 集群
- 事务
2.3 安装
2.3.1 window安装redis
安装地址
https://github.com/MicrosoftArchive/redis/releases;
msi直接安装。
我这里下载zip包
- 解压运行即可
但是官网不推荐使用win开发,所以尽量使用linux系统。
2.3.2 linux安装redis
网址 redis中文网 最新版本down下来就可以了
- tar -xvf 解压
- 安装 gcc 环境
yum install gcc-c++ - make 编译
- make install
linux 默认安装路经usr 目录下
进入 、usr/local/bin
复制 之前的redis。conf 到该目录下
修改配置
daemonize yes
启动redis
redis-server redis.conf
2.4 redis基础知识
-
redis默认有16哥数据库,在redis配置文件中可以看到,默认使用第0个
使用 select 切换数据库 dbsize 查看大小 -
redis是单线程的,cpu不是redis的性能瓶颈, redis性能是基于机器的内存和网络带宽决定的。redis是c语言写的官方提供的数据qps 10万+,所以性能不比memorycache差
redis 6.0 后引入了多线程 具体信息可以查看该篇博客
https://www.cnblogs.com/madashu/p/12832766.html
- 为什么单线程redis还这么快
keys * 查看所有key
flushdb 清空当前数据库
flushall 清空所有
exist key值 返回等于该key值得个数
expire key 10 设置10秒过期
ttl key 查看过期剩余时间
type key 查看当前key的类型
2.4.1 String类型
append key value 向key中添加字符串 如果不存在该key 那么就相当于set一个新值
strlen key 获取key 对中的 value 长度
incr key 相当于 +1 操作
decr key -1
incrby key 10 步数为10增长 DECRBY key 10 步数为10 减少
getrange key 0 3 相当于substring 截取字符串 0 -1 取得全部字符串
setrange key 2 sss 相当于replace 从索引2处开始替换
settex key 20 value 创建一个过期时间为20秒的 键值对 如果已存在则覆盖
setnx key value 不存在则添加,已存在则添加失败
getset key value 先获取再赋值
批量设置key与value
mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
msetnx 他可以保证原子性
redis存入对象
mset user:1:name 张三 user:2:name lisi
2.4.2 List 类型
与list命令有关的 都是以L开头
lpush key 1 2 3 4 向key 中放入元素 1234 这个是从左边依次放入
lrange key 1 3 从 左边索引为1为起始点获得元素
rpush key 5 从右边开始放入元素
lpop 左边移除
rpop 右边移除
lindex key value 获取索引为value的值
llen key 判断list的长度
LREM k1 1 3 移除掉1个 k1list 中元素为3 的元素
ltrim key 1 3 保留 key list中的 索引 1-3 的元素其他会被删除
RPOPLPUSH k1 k1 取出值 并添加到k1中
lset key value 设置值 不存在的话报错
LINSERT k1 before it new 插入元素 befor确定是从前 after 是从后
这里的list其实是一个链表 前后增删效率会很高,从中间添加或删除效率会很低
所以根据该特性 我们可以实现栈或队列
2.4.3set 类型
sadd key value
127.0.0.1:6379> SISMEMBER k2 new 集合k2是否存在new 这个值
smember key 查看所有元素
scard key 获取元素个数
srem key value 移除元素
SRANDMEMBER key count 随机抽选count个数
spop 随机删除元素
smove k1 k2 new 将k1中元素new 移到k2中
差集sdiff k1 k2
并集SUNION
交集sinter
2.4.4hash
127.0.0.1:6379> hset k4 kui 1 设置 k4 中的 map 中的 kui 为1
(integer) 1
127.0.0.1:6379> HGET k4 kui 得到值
hmset k4 name1 1 name2 2 name3 3批量设置
hmget k4 name1 name2 name3 批量获取
hgetall k4 获取全部
HDEL h4 kui 删除全部
hlen k4 获取键值对个数
HEXISTS k4 name1 判断是否存在
hkeys key 获取全部key
hvalue key 获取全部value
HINCRBY k4 name 5 增加5
hash更适合变更数据的存贮,以及对象的存储
2.4.5 zset 有序集合
因为他是个有序集合 所以key值一定是整数
zadd k6 1 name 向k6 中添加 元素name key值为1
ZRANGE k6 0 -1
ZRANGEBYSCORE k6 -inf +inf withscores 排序正无穷到负无穷 withscores是加上key数据打印
ZREM k6 2 移除元素
2.5 三种特殊数据类型
这里先不做描述 具体看参照官方文档,以后如果有具体实践我会再次编写
3 事务
它分为三个阶段
开启事务
multi
命令入队
执行事务
exec
放弃事务
discard
总结
简单的说就是开启事务时如果命令能够压入队列,那么就会执行所有除了运行时的异常命令,如果不能压入队列,就会都不执行
3.1 redis乐观锁
那么如何解决问题呢 通过unwatch 解锁
再重新加锁 watch money 继续事务 。知道循环成功为止
4 springboot整合redis
5 Redis.config
redis启动都是通过配置文件启动
-
单位
配置文件unit 单位,对大小写不敏感 -
包含
可以导入其他的配置文件。和jsp thymeleaf有点像。
- 网络
bind 127.0.0.1
这个是绑定地址,这里默认是绑定本地
我们可以自己添加固定ip允许访问redis
port 6370 端口
- 通用
daemonize yes
守护进程开启
关闭的话 无法后台运行
pidfile /var/run/redis_6379.pid
如果以后台方式运行需要指定pid文件
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
日志级别
# it will abort. It is possible to use multiple loadmodule directives.
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""
默认日志文件名
rdbcompression yes 是否压缩rdb文件 压缩会消耗一定的cpu资源
rdbchecksum yes 是否校验 如果失败则会自动修复
dir ./ rdb文件保存目录
5. REPLICATION 主从复制
6. security
设置密码 redis默认没有密码 可以使用命令
config get requirepass 查看是否设置密码
配置文件设置
requirepass 123456 设置密码为123456
6 redis持久化
默认保存为 dump.rdb
6.1恢复rdb文件
将rdb文件放到启动目录下
6.2优缺点
再生产环境需要对rdb文件备份