Redis数据库发展历史

70 阅读9分钟

背景

随着互联网+大数据时代的来临,创痛的关系数据已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈

数据库发展历史

  1. 在互联网+大数据史黛拉来临之前,企业的一些内部信息管理系统,一个单个数据库实例就能满足洗头膏需求

  2. 随着系统访问用户的增多,数据量的增大,单个数据库实例已经满足不了系统的读取需求

    缓存(memcahe) + 单数据库实例

  3. 缓存可以缓解系统的读取压力,但是数据量的写入压力持续增大

    缓存+主从数据库+读写分离

  4. 数据量再次增大,读写分离以后,主数据库的写库压力出现瓶颈

    缓存+主从数据库集群+读写分离+分库分表

  5. 互联网+大数据时代来临,关系型数据库不能很好的存取一些并发性高,实时性高的,并且数据格式不固定的数据

    NoSQL+主从数据库集群+读写分离+分库分表

图片.png

图片.png

图片.png

Redis数据库是什么

Redis是一个高性能的,开源的,C语言开发的,键值对存储数据的NoSQL数据库

NoSQL: not only sql,泛指非关系型数据库 Redis/MongoDB/Hbase Hadoop

关系型数据库:MySQL、Oracle、SqlServer

Redis特性

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供List,set等数据类型
  • Redis支持数据的备份

Redis有什么用?

快速存取

Redis应用场景

  • 点赞
  • 秒杀
  • 直播平台的在线好友列表
  • 商品排行榜
  • 点击登录

Redis怎么⽤?

官⽹地址:redis.io/

命令地址:doc.redisfans.com/

Redis的五大数据类型以及应用场景

  • string
  • list
  • set
  • hash
  • zset

Redis的安装及启动

在Windows中下载解压即可

图片.png

启动

PS E:\Redis-x64-5.0.14.1> .\redis-server
[3464] 19 Nov 10:33:37.591 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
[3464] 19 Nov 10:33:37.591 # Redis version=5.0.14.1, bits=64, commit=ec77f72d, modified=0, pid=3464, just started
[3464] 19 Nov 10:33:37.592 # Warning: no config file specified, using the default config. In order to specify a config file use e:\redis-x64-5.0.14.1\redis-server.exe /path/to/redis.conf
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 5.0.14.1 (ec77f72d/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 3464
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

[3464] 19 Nov 10:33:37.595 # Server initialized
[3464] 19 Nov 10:33:37.596 * Ready to accept connections
PS E:\Redis-x64-5.0.14.1> .\redis-server --version
Redis server v=5.0.14.1 sha=ec77f72d:0 malloc=jemalloc-5.2.1-redis bits=64 build=5627b8177c9289c

启动后该页面会陷入阻塞状态

连接

PS E:\Redis-x64-5.0.14.1> .\redis-cli
127.0.0.1:6379>

Redis配置文件

www.cnblogs.com/kreo/p/4423…

/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

Redis数据库简单使用

查看当前数据库的key数量
127.0.0.1:6379[1]> DBSIZE
(integer) 0

查看key的内容
key *

清空当前数据库的key的数量
127.0.0.1:6379[1]> FLUSHDB
OK

清空所有库的key(慎用)
127.0.0.1:6379[1]> FLUSHALL

判断key是否存在
127.0.0.1:6379[1]> EXISTS 1
(integer) 0

Redis常用五大数据类型

1.redis-string

string 是redis最基本的类型,一个key对应一个value

string 可以包含任何数据,最大不能超过512M

set/get/del/append/strlen

set ---- 设置值

get ---- 获取值

mset ---- 设置多个值

mget ---- 获取多个值

append ---- 添加字段

del ---- 删除

strlen ---- 返回字符串长度

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> mset name lisi age 23 sex nan
OK
127.0.0.1:6379> mget name age
1) "lisi"
2) "23"
127.0.0.1:6379> mget name
1) "lisi"
127.0.0.1:6379> mget name age sex
1) "lisi"
2) "23"
3) "nan"
127.0.0.1:6379> append name 1
(integer) 5
127.0.0.1:6379> get name
"lisi1"
127.0.0.1:6379> strlen name
(integer) 5
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> mget name age sex
1) (nil)
2) "23"
3) "nan"
127.0.0.1:6379>

incr/decr/incrby/decrby

incr ---- 增加

decr ---- 减少

incrby ---- 制定增加多少

decrby ---- 指定减少多少

127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
127.0.0.1:6379> incr num
(integer) 4
127.0.0.1:6379> decr num
127.0.0.1:6379> decrby num 2
(integer) 2
127.0.0.1:6379> decrby num 2
(integer) 0
127.0.0.1:6379> decrby num 2
(integer) -2
127.0.0.1:6379> incrby num 3
(integer) 1
127.0.0.1:6379> incrby num 3
(integer) 4
127.0.0.1:6379>

getrange/setrange

getrange ---- 获取指定区间范围内的值,类似between... and的关系

setrange ---- 代表从第几位开始替换,下脚本从零开始

从0 -1表示全部

127.0.0.1:6379> set address yunnan
OK
127.0.0.1:6379> get address
"yunnan"
127.0.0.1:6379> getrange address 0 -1
"yunnan"
127.0.0.1:6379> getrange address 0 2
"yun"
127.0.0.1:6379> setrange address 0 zhang
(integer) 6
127.0.0.1:6379> getrange address 0 -1
"zhangn"

2. redis-list(单值多value)

List(列表)

列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素列表的头部(左边) 或者尾部(右边)

它的底层实际是个链表

lpush/rpush/lrange

lpush/rpush/lrange ---- 从左/从右/获取指定长度

lpush li1 1 2 3 4 5 倒序排列

rpush li2 1 2 3 4 5 正序排列

lrange li1 0 -1 获取li1 中的所有值

127.0.0.1:6379> lpush li1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange li1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpush li2 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange li2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

lindex, 按照索引下标获得元素(从上到下)

lindex li1 1

127.0.0.1:6379> lrange li1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lindex li1 1
"4"

llen,求列表长度

127.0.0.1:6379> llen li1
(integer) 5

lrem key

删N个value

在列表li1 中删除2个1

127.0.0.1:6379> lpush li3 1 1 2 2 1 5 3
(integer) 7
127.0.0.1:6379> lrange li3 0 -1
1) "3"
2) "5"
3) "1"
4) "2"
5) "2"
6) "1"
7) "1"
127.0.0.1:6379> lrem li3 2 1
(integer) 2
127.0.0.1:6379> lrange li3 0 -1
1) "3"
2) "5"
3) "2"
4) "2"
5) "1"

ltrim key

ltrim ---- 开始index结束index,截取指定范围的值后在赋值给key

127.0.0.1:6379> lrange li3 0 -1
1) "3"
2) "5"
3) "2"
4) "2"
5) "1"
127.0.0.1:6379> ltrim li3 0 2
OK
127.0.0.1:6379> lrange li3 0 -1
1) "3"
2) "5"
3) "2"
127.0.0.1:6379>

rpoplush li1 li2 将li1中最后一个压入li2中第一位

127.0.0.1:6379> lrange li1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrange li2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpoplpush li1 li2
"1"
127.0.0.1:6379> lrange li2 0 -1
1) "1"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
127.0.0.1:6379> lrange li1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379>

lset key index value

127.0.0.1:6379> lrange li3 0 -1
1) "3"
2) "5"
3) "2"
127.0.0.1:6379> lset li3 0 6
OK
127.0.0.1:6379> lrange li3 0 -1
1) "6"
2) "5"
3) "2"

将li3中第一位换成6

linsert key before/after

127.0.0.1:6379> lrange li3 0 -1
1) "6"
2) "5"
3) "2"
127.0.0.1:6379> linsert li3 before "2" php
(integer) 4
127.0.0.1:6379> lrange li3 0 -1
1) "6"
2) "5"
3) "php"
4) "2"

3. redis-Hash

hash是一个键值对集合

hash是一个string类型的field和value的映射表,hash特别适合存储对象

hset/hget/hmset/hgetall/hdel

设置/取值/设置多个值/取多个值/取全部值/删除值

127.0.0.1:6379> hset user id 11
(integer) 1
127.0.0.1:6379> hget user id
"11"
127.0.0.1:6379> hmset customer id 11 name muyi age 22
OK
127.0.0.1:6379> hmget customer id name age
1) "11"
2) "muyi"
3) "22"
127.0.0.1:6379> hgetall customer
1) "id"
2) "11"
3) "name"
4) "muyi"
5) "age"
6) "22"
127.0.0.1:6379> hdel user id
(integer) 1

hlen 求哈希长度

127.0.0.1:6379> hlen customer
(integer) 3

hexists key 在key里面的某个值

存在返回1,不存在返回0

127.0.0.1:6379> hexists customer name
(integer) 1

hkeys/hvals

返回哈希表中的所有字段名/值

127.0.0.1:6379> hkeys customer
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hvals customer
1) "11"
2) "muyi"
3) "22"

4.redis-set(不重复的)

Set(集合)

set是string类型的无序集合

sadd/smembers/sismember

添加/查看集合/查看是否存在

127.0.0.1:6379> sadd set1 1 2 2 3 3
(integer) 3
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sismember set1 1
(integer) 1

scard 获取集合里面的元素个数

127.0.0.1:6379> scard set1
(integer) 3

srem key value 删除集合中元素

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> srem set1 3
(integer) 1
127.0.0.1:6379> smembers set1
1) "1"
2) "2"

srandmember key 随机出几个数

127.0.0.1:6379> sadd set2 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> srandmember set2 2
1) "7"
2) "3"
127.0.0.1:6379> srandmember set2 2
1) "8"
2) "4"

spop key 随机出栈

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
127.0.0.1:6379> spop set1
"2"
127.0.0.1:6379> smembers set1
1) "1"

smove key1 key2

127.0.0.1:6379> sadd set3 x y z
(integer) 3
127.0.0.1:6379> smembers set3
1) "z"
2) "x"
3) "y"
127.0.0.1:6379> smove set1 set3 1
(integer) 1
127.0.0.1:6379> smembers set3
1) "z"
2) "x"
3) "1"
4) "y"

数学集合类

127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd set2 1 2 3 a b
(integer) 2

差集

127.0.0.1:6379> sdiff set1 set2
1) "4"
2) "5"

交集

127.0.0.1:6379> sinter set1 set2
1) "1"
2) "2"
3) "3"

并集

127.0.0.1:6379> sunion set1 set2
 1) "2"
 2) "4"
 3) "1"
 4) "3"
 5) "8"
 6) "5"
 7) "6"
 8) "7"
 9) "a"
10) "b"

redis-Zset

Zset(有序集合)

zadd/zrange

127.0.0.1:6379> zadd zset1 60 v1 70 v2 80 v3 90 v4 100 v5
(integer) 5
127.0.0.1:6379> zrange zset1 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "v1"
 2) "60"
 3) "v2"
 4) "70"
 5) "v3"
 6) "80"
 7) "v4"
 8) "90"
 9) "v5"
10) "100"

zrangebyscore key start end——根据开始结束取值

127.0.0.1:6379> zrangebyscore zset1 60 70
1) "v1"
2) "v2"


127.0.0.1:6379> zrangebyscore zset1 60 (90 withscores  表示不包含90
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"

127.0.0.1:6379> zrangebyscore zset1 60 90 limit 1 2 withscores 从第一条开始截取21) "v2"
2) "70"
3) "v3"
4) "80"

zrem key value ——某score下对应的value值,作用是删除元素

127.0.0.1:6379> zrange zset1 0 -1 withscores
 1) "v1"
 2) "60"
 3) "v2"
 4) "70"
 5) "v3"
 6) "80"
 7) "v4"
 8) "90"
 9) "v5"
10) "100"
127.0.0.1:6379> zrem zset1 v1
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "v2"
2) "70"
3) "v3"
4) "80"
5) "v4"
6) "90"
7) "v5"
8) "100"

zcard/zcount key score 区间/zrank key values

127.0.0.1:6379> zcard zset1  求总条数
(integer) 4
127.0.0.1:6379> zcount zset1 60 9060-90个数
(integer) 3
127.0.0.1:6379> zrank zset1 v2 返回1 返回对应下角标,从0开始
(integer) 0