Redis 非关系型数据库,缓存型数据库
关系型数据库是一个机构化的数据库,和列
列声明对象
行,纪录对象的属性
表与表之间是有关联,使用sql语句,来对指定的表,库,进行增删改查
在创建表时,我们是设计好了表的结构,按照表结构来存储数据,数据与表表结构不匹配,存储数据,会失败
非关系型数据库:nosql not only sql
不需要定义库,也不需要定义表结构,直接纪录即可,而且每条纪录都可以有不同的数据类型,字段(字段个数)
Redis key:value 键值对形式存储,每个键之间没有直接关联。库与库之间互相独立
1、数据的存储方式不同
2、扩展方式不同,性能上的提升,关系型数据库靠的是提升本机性能,非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能
3、对事务的支持性,mysql支持事务
原子性
隔离性
一致性
持久性
非关系型数据库也支持事务,Redis也可以支持事务,但是稳定性和处理能力都不如关系型数据库
1、操作的扩展
2、海量数据处理
web2.0:交互
纯动态网站的三高问题
1、对数据库高并发读写的需求
2、对海量数据高效存储与访问的需求
3、对数据的高可扩展性与高可用性的需求
常见的缓存需求场景
数据库缓存
web页面缓存
CPU和硬盘之间缓存
关系型数据库
库----表-----行,列-------->存储对象
非关系数据库
库-----集合------>键值对
不需要手动的创建库和集合
Redis:开源的,使用C语言编写的NQL数据库
Redis:基于内存运行,支持持久化(数据恢复),采用的就是key-value(键值对)的存储形式,目前在分布式架构中,非常重要的一环
Redis服务器程序,是一个单进程模式,即只有一个主进程工作,也就是说在一台服务器上可以启动多个Redis(端口号不能冲突)
Redis的实际处理速度是完全依靠主进程的执行效率
服务器值部署了一个Redis进程,多个客户端访问,可能会导致Redis的处理能力下降,如果部署了多个进程,虽然能提高Redis的并发处理能力,但是会给服务器的CPU带来很大的压力
一台服务器,一般部署3个Redis进程 (根据情况而看,高并发,要部署多个,一般的情况,单进程足够)
1、具有极高的读写速度,数据读写每秒110000次,写入数据每秒可以执行81000的写入
2、支持丰富的数据类型
3、支持持久化,平常数据保存在内存中,持久化可以写入到磁盘中,既可以保存到本地,也可以实现备份
4、原子性,所有的操作都是原子性
5、支持主从模式----master-slave模式
- 把源码拖进opt目录下
- 关闭防火墙和安全机制
-
- yum install -y gcc gcc-c++ make
-
- 解压源码包
-
- 进入解压之后的目录
- cd /redis-5.0.7/
-
- 编译安装
- make -j 4 && make install
-
- make PREFIX=/usr/local/redis install
-
- cd utils
- ./install_server.sh
-
- 4个回车
- /usr/local/redis/bin/redis-server
-
- ln -s /usr/local/redis/bin/* /usr/local/bin/
-
- netstat -antp | grep redis
-
- /etc/init.d/redis_6379 status
-
- vim /etc/redis/6379.conf
- 70行
- bind 127.0.0.1 20.0.0.20
-
- /etc/init.d/redis_6379 restart
-
- netstat -antp | grep redis
- Redis-server:直接启动Redis ,只能启动
- Redis-benchmark:检测Redis在本机上的运行效率
- Redis-cli: 命令行工具
- Redis-check-aof:检测AOF文件是否正常
- Redis-check-rdb:检测rdb文件是否正常
Redis-benchmark的语法
- -h:指定服务器的主机名IP地址
- -p:指定服务器端口号
- -c:指定并发连接数
- -n:指定请求数
1、如何进入redis?
- redis-cli -h 20.0.0.20 -p 6379
-
- -h 指定IP地址
- -p 指定端口号
- -a 指定登录密码
1、string(字符串):也是redis最近本的类型,最大能存储512MB的数据,可以存储任何数据,数字,蚊子,图片等等
- 展示有多少的键值对
- keys *
-
- 20.0.0.20:6379> keys t*
- 1) "test"
-
-
- 创建键
- set test xiaobu
-
- 20.0.0.20:6379> set test xiaobu
- OK
-
-
- 查看键
- get test
-
- 20.0.0.20:6379> get test
- "xiaobu"
-
-
- * 任意字符
-
- 20.0.0.20:6379> keys t*
- 1) "test"
-
-
- keys t??? 表示两个字符
- 20.0.0.20:6379> keys t???
- 1) "test"
-
-
- EXISTS 键名
- 返回值为1 已创建
- 20.0.0.20:6379> exists test
- (integer) 1
-
- 返回值为0 未创建
- 20.0.0.20:6379> exists tests
- (integer) 0
-
-
-
- 删除多个键
- del 键名1 键名2
-
- 20.0.0.20:6379> del test1 test
- (integer) 2
- 20.0.0.20:6379> keys *
- (empty list or set)
-
-
- APPEND test1 hello
- APPEND test1 world
-
- 20.0.0.20:6379> append test hello
- (integer) 5
- 20.0.0.20:6379> append test world
- (integer) 10
- 20.0.0.20:6379> get test
- "helloworld"
-
-
- 该键自增
- INCR test1
- 20.0.0.20:6379> incr test1
- (integer) 11
- 20.0.0.20:6379> get test1
- "11"
-
- 该键自减
- decr test1
-
-
-
- 指定增加
- incrby test1 30
- 20.0.0.20:6379> incrby test1 10
- (integer) 40
- 20.0.0.20:6379> get test1
- "40"
-
-
- 指定减少
- decrby test1 35
- 20.0.0.20:6379> decrby test1 35
- (integer) 5
- 20.0.0.20:6379> get test1
- "5"
-
-
-
- 给新键值设置生命周期
- setex test2 15 lo
-
- 查看生命周期
- ttl test2
- 20.0.0.20:6379> setex test2 15 lo
- OK
- 20.0.0.20:6379> ttl test2
- (integer) 9
- 20.0.0.20:6379> ttl test2
- (integer) 8
- .......
- 20.0.0.20:6379> ttl test2
- (integer) 2
- 20.0.0.20:6379> ttl test2
- (integer) 1
- 20.0.0.20:6379> ttl test2
- (integer) -2
-
-
-
-
- -1 永不过期
- -2 表示已经过期
-
- 对已有键值设置生命周期
- expire test 30
- 20.0.0.20:6379> EXPIRE test 30
- (integer) 1
- 20.0.0.20:6379> ttl test
- (integer) 22
- 20.0.0.20:6379> ttl test
- (integer) 21
- 20.0.0.20:6379> ttl test
- (integer) 19
- ......
- 20.0.0.20:6379> ttl test
- (integer) 13
- 20.0.0.20:6379> ttl test
- (integer) 11
- 20.0.0.20:6379> ttl test
- (integer) 10
-
-
-
-
- 创建多个键
- mset key1 hello key2 world
- 查看多个键
- mget key1 key2
- 20.0.0.20:6379> mset key1 hello key2 world
- OK
- 20.0.0.20:6379> mget key1 key2
- 1) "hello"
- 2) "world"
-
2、list数据类型
列表当中的元素还是string
- 创建倒序列表
- lpush 列表名称 1 2 3 4 5
- 20.0.0.20:6379> lpush test 1 2 3 4 5
- (integer) 5
-
-
- 查看列表(倒序)
- lrange 列表名称 0 -1
- 20.0.0.20:6379> lrange test 0 -1
- 1) "5"
- 2) "4"
- 3) "3"
- 4) "2"
- 5) "1"
-
-
- 0表示第一个数
- -1表示最后一个数
- 指定索引值查看对应值
- lindex 列表名称 0
- 20.0.0.20:6379> lindex test 0
- "5"
- 20.0.0.20:6379> lindex test 4
- "1"
-
- 创建正序列表
- rpush 链表名称 1 2 3 4
- 20.0.0.20:6379> rpush test1 1 2 3 4 5
- (integer) 5
-
-
- 查看列表
- lrange 列表名称 0 -1
- 20.0.0.20:6379> lrange test1 0 -1
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
- 5) "5"
-
- 指定索引值查看对应值
- lindex 列表名称 0
- 20.0.0.20:6379> lindex test1 3
- "4"
-
- 查看元素
- llen 列表名称
-
-
- 修改设置的索引值
- lset 列表名称 索引值
- 20.0.0.20:6379> lset test1 1 11
- OK
-
-
- 在指定位置前面插入
- linsert 列表名称 before 3 xiaobu
- 20.0.0.20:6379> linsert test1 before 3 xiaobu
- (integer) 6
-
-
- 在上下插入值
- lpush test1 xiao (在上插入)
- 20.0.0.20:6379> lpush test1 10
- (integer) 7
- 20.0.0.20:6379> lrange test1 0 -1
- 1) "10"
- 2) "1"
- 3) "11"
- 4) "xiaobu"
- 5) "3"
- 6) "4"
- 7) "5"
-
- rpush test1 12 (从下插入)
- 20.0.0.20:6379> rpush test1 12
- (integer) 8
- 20.0.0.20:6379> lrange test1 0 -1
- 1) "10"
- 2) "1"
- 3) "11"
- 4) "xiaobu"
- 5) "3"
- 6) "4"
- 7) "5"
- 8) "12"
-
-
- 删除上下
- lpop test1 (从上)
- 20.0.0.20:6379> lpop test1
- "10"
- 20.0.0.20:6379> lrange test1 0 -1
- 1) "1"
- 2) "11"
- 3) "xiaobu"
- 4) "3"
- 5) "4"
- 6) "5"
- 7) "12"
-
- rpop test1 (从下删除)
- 20.0.0.20:6379> rpop test1
- "12"
- 20.0.0.20:6379> lrange test1 0 -1
- 1) "1"
- 2) "11"
- 3) "xiaobu"
- 4) "3"
- 5) "4"
- 6) "5"
-
3、hash类型
hash类型用于存储对象,采用hash格式来进行操作,占用的磁盘空间少,而且一个hash可以存储42个键值对,可以存储多个键值
- hash 列表名称 tall yes
- 20.0.0.20:6379> hset test2 tall yes
- (integer) 1
-
- 查看列表
- hget 列表名称 tall
- 20.0.0.20:6379> hget test2 tall
- "yes"
-
- 添加新内容
- hset 列表名称 handsan yes
- 20.0.0.20:6379> hset test2 handsan 2
- (integer) 1
-
- 查看多个
- hmget 列表名称 tall handsan
- 20.0.0.20:6379> hmget test2 tall handsan
- 1) "yes"
- 2) "2"
-
- 添加字段
- hset 列表名称 age 20
- 20.0.0.20:6379> hset test2 age 22
- (integer) 1
-
-
- 查看多个
- hmget 列表名称 tall handsan age
- 20.0.0.20:6379> hmget test2 tall handsan age
- 1) "yes"
- 2) "2"
- 3) "22"
-
- 删除一个或者多个
- hdel 列表名称 handsan tall
- 20.0.0.20:6379> hmget test2 age
- 1) "22"
- 20.0.0.20:6379> hmget test2 tall handsan age
- 1) (nil)
- 2) (nil)
- 3) "22"
-
-
- 一次性设置多个字段
- hmset 列表名称 字段1 值1 字段2 值2 字段3 值3
- 20.0.0.20:6379> hmset test3 tall 1 handsan yes age 22
- OK
- 20.0.0.20:6379> hmget test3 tall handsan age
- 1) "1"
- 2) "yes"
- 3) "22"
-
-
- 查询所有(字段和值)
- hgetall 列表名称
- 20.0.0.20:6379> hgetall test3
- 1) "tall"
- 2) "1"
- 3) "handsan"
- 4) "yes"
- 5) "age"
- 6) "22"
-
- 查询字段
- hkeys 列表名称
- 20.0.0.20:6379> hkeys test3
- 1) "tall"
- 2) "handsan"
- 3) "age"
-
-
- 查看字段对应的值
- hvals 列表名称
- 20.0.0.20:6379> hvals test3
- 1) "1"
- 2) "yes"
- 3) "22"
-
-
- 删除列表
- del 列表名称
4、set数据类型(无序集合)元素类型也是string元素是唯一的,不允许重复,多个集合类型可以进行并集,交集和差集运算
set当中的元素类型是唯一的,可以跟踪一些唯一性的数据,访问微博的用户名,只要把对应名称redis ,set集合可以自动保存唯一性,方便下一次的访问
- 创建集合
- sadd 集合名称 a c
- 20.0.0.20:6379> sadd test a b c d
- (integer) 4
-
- 查看集合
- smembers 集合名称
- 20.0.0.20:6379> smembers test
- 1) "c"
- 2) "a"
- 3) "d"
- 4) "b"
-
- 查看集合中是否存在
- sismember 集合名称 c
- 返回值为1 表示存在
- 20.0.0.20:6379> sismember test b
- (integer) 1
-
- 返回值为0 表示不存在
- 20.0.0.20:6379> sismember test f
- (integer) 0
-
-
- 随机查看
- srandmember 集合名称
- 20.0.0.20:6379> srandmember test
- "a"
- 20.0.0.20:6379> srandmember test
- "c"
-
-
- 随机移除
- spop 集合名称
- 20.0.0.20:6379> spop test
- "b"
- 20.0.0.20:6379> smembers test
- 1) "c"
- 2) "a"
- 3) "d"
-
- 指定移除
- srem 集合名称 a b c
- 20.0.0.20:6379> srem test c a
- (integer) 2
- 20.0.0.20:6379> smembers test
- 1) "d"
5、有序集合,有序集合,元素类型也是string,元素唯一,不能重复
每个元素都会关联一个double(小数点) 的分数(sroce,表示权重),可以通过权重的大小,进行排序,元素的权重可以相同
- zset
- 在线积分的排行榜,可以实时更新用户的分数,可以使用zrange命令获取积分top10 的用户,zrank命令通过username来获取用户的排行信息
-
- 创建
- zadd 集合名称 权重 元素
- zadd myzset 1 one
- 20.0.0.20:6379> zadd test1 1 one
- (integer) 1
- 20.0.0.20:6379> zadd test1 1 one 2 two 3 three
- (integer) 2
-
- 查看集合(权重和元素)
- zrange 集合名称 0 -1 withscore
- 20.0.0.20:6379> zrange test1 0 -1 withscores
- 1) "one"
- 2) "1"
- 3) "two"
- 4) "2"
- 5) "three"
- 6) "3"
-
- 查看集合(元素)
- zrange 集合名称 0 -1
- 20.0.0.20:6379> zrange test1 0 -1
- 1) "one"
- 2) "two"
- 3) "three"
-
- 查看索引值
- zrank 集合名称 元素
- 20.0.0.20:6379> zrank test1 two
- (integer) 1
- 20.0.0.20:6379> zrank test1 three
- (integer) 2
- 20.0.0.20:6379> zrank test1 one
- (integer) 0
- 20.0.0.20:6379> zrank test1 four
- (nil)
-
-
-
- 查看成员数量
- zcard 集合名称
- 20.0.0.20:6379> zcard test1
- (integer) 3
-
-
- 统计权重1到2的范围 1<= score<=2
- zcount 集合名称 1 2
- 20.0.0.20:6379> zcount test1 1 2
- (integer) 2
- 20.0.0.20:6379> zcount test1 1 3
- (integer) 3
-
- 删除(权重)
- zrem 集合名称 元素
- 20.0.0.20:6379> zrem test1 one
- (integer) 1
- 20.0.0.20:6379> zrange test1 0 -1
- 1) "two"
- 2) "three"
-
- 查看元素的权重
- zscore 集合名称 元素
- 20.0.0.20:6379> zscore test1 two
- "2"
-
-
- 清空所有
- flushall
set和hset 创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可
对一个键进行多个字段存储,节省内存,使用hash方式
改变键重命名
- set test 10
- get test
-
- 改变键名
- rename test xiaobu
- get xiaobu
- 20.0.0.20:6379> set test 10
- OK
- 20.0.0.20:6379> get test
- "10"
- 20.0.0.20:6379> rename test xiaobu
- OK
- 20.0.0.20:6379> keys *
- 1) "xiaobu"
-
-
- redis的库,库都是创建好的库,16个库
- 数字排名:0-15
- 查看当前库的键
- dbsize
-
- 切换库
- select 库值
- 20.0.0.20:6379> select 1
- OK
- 20.0.0.20:6379[1]>
-
- 移动键
- move 键名 库值
- 20.0.0.20:6379> keys *
- 1) "xiaobu"
- 20.0.0.20:6379> move xiaobu 1
- (integer) 1
- 20.0.0.20:6379> keys *
- (empty list or set)
- 20.0.0.20:6379> select 1
- OK
- 20.0.0.20:6379[1]> keys *
- 1) "xiaobu"
-
- 给redis设置密码
- config set requirepass 123456
- 在内声明密码
- auth 123456
- 20.0.0.20:6379[1]> config set requirepass 123456
- OK
- 20.0.0.20:6379[1]> auth 123456
- OK
-
- 在外声明密码
- redis-cli -h 20.0.0.20 -p 6379 -a 123456
- [root@redis1 utils]# redis-cli -h 20.0.0.20 -p 6379 -a 123456
- Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
- 20.0.0.20:6379> select 1
- OK
- 20.0.0.20:6379[1]> keys *
- 1) "xiaobu"
-
- 删除当前库
- flushdb
-
- 清除所有库
- flushall
1、读写速度快
2、数据类型 1、string
2、list(string)
3、hash 对一个键进行多字段操作要用hash 节省内存空间
4、无序集合 set 元素不能重复,可以用来定义唯一值
5、有序集合zset,元素不能重复,但是权重可以相同,用来排名