![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg)
*****
## Redis内存数据库
### 背景
随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈。
### 数据库的发展历史
1.在互联网+大数据时代来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足系统的需求
单数据库实例
<br>2.随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求
缓存(memcache)+单数据库实例
<br>3.缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大,
缓存+主从数据库+读写分离
<br>4.数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈、
缓存+主从数据库集群+读写分离+分库分表
<br>5.互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据。
nosql+主从数据库集群+读写分离+分库分表
### Redis是什么?
Redis是一个高性能的,开源的,C语言开发的,键值对存储数据的nosql数据库。
<br>NoSQL:not only sql,泛指非关系型数据库 Redis/MongoDB/Hbase Hadoop
<br>关系型数据库:MySQL、oracle、SqlServer
### Redis特性
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
- Redis支持数据的备份
### Redis有什么用?
Redis的主要作用:快速存取
### Redis应用场景
点赞/秒杀/直播平台的在线好友列表/商品排行榜/单点登录
### Redis怎么用?
官网地址:https://redis.io/
命令地址:http://doc.redisfans.com/
Redis的五大数据类型以及应用场景
```
string/list/set/hash/zset
```
### Redis的安装及启动
```
sudo apt-get install redis-server
查看帮助命令
redis-server --help
编辑Redis配置文件
sudo vim /etc/redis/redis.conf
将daemonize no改为 daemonize yes保存退出
启动
redis-server
打开服务
sudo service redis start
关闭服务
sudo service redis stop
```
### Redis的配置文件
```
/etc/redis/redis.conf
当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
daemonize no
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
设置数据库的数目。
databases 16
根据给定的时间间隔和写入次数将数据保存到磁盘
下面的例子的意思是:
900 秒内如果至少有 1 个 key 的值变化,则保存
300 秒内如果至少有 10 个 key 的值变化,则保存
60 秒内如果至少有 10000 个 key 的值变化,则保存
save 900 1
save 300 10
save 60 10000
监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379
Redis默认只允许本地连接,不允许其他机器连接
bind 127.0.0.1
```
更多配置文件:https://www.cnblogs.com/kreo/p/4423362.html
### Redis数据库简单使用
```
DBSIZE 查看当前数据库的key数量
keys * 查看key的内容
FLUSHDB 清空当前数据库的key的数量
FLUSHALL 清空所有库的key(慎用)
exists key 判断key是否存在
```
## redis常用五大数据类型
### 1.redis-string
string是redis最基本的类型,一个key对应一个value
![](https://img.kancloud.cn/9b/90/9b90063fc910f3edf3c970b7e4bbfbd3_400x90.gif)
string可以包含任何数据,最大不能超过512M
<br>1.set/get/del/append/strlen
```
set ---- 设置值
get ---- 获取值
mset ---- 设置多个值
mget ---- 获取多个值
append ---- 添加字段
del ---- 删除
strlen ---- 返回字符串长度
```
2.incr/decr/incrby/decrby
```
incr ---- 增加
decr ---- 减少
incrby ----- 制定增加多少
decrby ----- 制定减少多少
```
3.getrange/setrange
```
getrange ---- 获取指定区间范围内的值,类似between....and的关系
setrange ---- 代表从第几位开始替换,下脚本从零开始
从0 -1表示全部
```
### 2.redis-list(单值多value)
List(列表)
列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边)或者尾部(右边)
它的底层实际是个链表
<br>1.lpush/rpush/lrange
```
lpush/rpush/lrange ---- 从左/从右/获取指定长度
lpush list01 1 2 3 4 5 倒序排列
rpush list02 1 2 3 4 5 正序排列
lrange list01 0 -1 获取list01 中的所有值
```
2.lpop/rpop
```
lpop/rpop ---- 移除最左/最右
lpop list01 删除元素5
rpop list01 删除元素1
```
3.lindex,按照索引下标获得元素(从上到下)
```
lrange list01 0 -1
lindex list01 1
```
4.llen,求列表长度
```
llen list01
```
5.lrem key
```
删N个value
lrem list01 2 1 在list01中删除2个1
```
6.ltrim key
```
ltrim ---- 开始index结束index,截取指定范围的值后在赋值给key
ltrim list01 0 2 截取list01 从0到2的数据在赋值给list01
```
7.rpoplpush list1 list2 将list1中最后一个压入list2中第一位
```
lrange list01 0 -1
lrange list02 0 -1
rpoplpush list1 list2
```
8.lset key index value
```
lset list01 0 x 将list02中第一位换成x
```
9.linsert key before/after
```
linsert list01b before x php 在x之前加字段php
```
### 3.redis-Hash
hash是一个键值对集合
hash是一个string类型的field和value的映射表,hash特别适合存储对象
<br>1.hset/hget/hmset/hmget/hgetall/hdel
```
设值/取值/设值多个值/取多个值/取全部值/删除值
hset user id 11
hget user id
hmset customer id 11 name juran age 26
hmget customer id name age 只返回相应的值
hgetall customer 返回全部
hdel user id 删除id
```
2.hlen
```
求哈希长度
hlen customer
```
3.hexists key
```
hexists ---- 在key里面的某个值
存在返回1 ,不存在返回0
```
4.hkeys/hvals
```
hkeys students
hvals students
```
### 4.redis-set(不重复的)
Set(集合)
set是string类型的无序集合
<br>1.sadd/smembers/sismember
```
sadd/smembers/sismember ---- 添加/查看集合/查看是否存在
sadd set01 1 2 2 3 3 去掉重复添加
smembers set01 得到set01
sismember set01 1 如果存在返回1 不存在返回0
```
2.scard
```
scard ---- 获取集合里面的元素个数
scard set01
```
3.srem key value
```
srem ---- 删除集合中元素
srem set01 3
SMEMBERS set01 3已经被删除掉
```
4.srandmember key
```
srandmembe ---- 随机出几个数
sadd set02 1 2 3 4 5 6 7 8
srandmember set02 2
```
5.spop key
```
spop ---- 随机出栈
spop set01
```
6.smove key1 key2
```
sadd set03 x y z
smove set01 set03 2 将set01中的2 移动到set03中
```
7.数学集合类
```
sadd set01 1 2 3 4 5
sadd set02 1 2 3 a b
差集
SDIFF set01 set02 返回 4 5 在第一个set中不在第二个set中
交集
SINTER set01 set02 返回 1 2 3
并集
SUNION set01 set02 返回set01 set02 中的值 去掉重复
```
#### 5.redis-Zset
Zset(有序集合)
1.zadd/zrange
```
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1
带分数返回 withscores
```
2.zrangebyscore key start end
```
zrangebyscore key start end----根据开始结束来取值
zrangebyscore zset01 60 70
zrangebyscore zset01 60 (90 表示不包含90
zrangebyscore zset01 60 90 limit 1 2 从第一条开始截取2条
```
3.zrem key
```
zrem key value---- 某score下对应的value值,作用是删除元素
zrem zset01 v1
```
4.zcard/zcount key score 区间/zrank key values
```
zcard 求zset01 总条数
zcount zset01 60 90 求60-90个数
zrank zset01 v2 返回1 返回对应下角标,从0开始
```