redis

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进程 (根据情况而看,高并发,要部署多个,一般的情况,单进程足够)

Redis的特点

1、具有极高的读写速度,数据读写每秒110000次,写入数据每秒可以执行81000的写入

2、支持丰富的数据类型

3、支持持久化,平常数据保存在内存中,持久化可以写入到磁盘中,既可以保存到本地,也可以实现备份

4、原子性,所有的操作都是原子性

5、支持主从模式----master-slave模式

部署Redis
把源码拖进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的命令工具
Redis-server:直接启动Redis ,只能启动
Redis-benchmark:检测Redis在本机上的运行效率
Redis-cli: 命令行工具
Redis-check-aof:检测AOF文件是否正常
Redis-check-rdb:检测rdb文件是否正常

Redis-benchmark的语法

-h:指定服务器的主机名IP地址
-p:指定服务器端口号
-c:指定并发连接数
-n:指定请求数
redis的数据类型

1、如何进入redis?

redis-cli -h 20.0.0.20 -p 6379

-h 指定IP地址
-p 指定端口号
-a 指定登录密码
redis数据类型 五大数据类型

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
redis的特点

1、读写速度快

2、数据类型    1、string

                        2、list(string)

                        3、hash 对一个键进行多字段操作要用hash 节省内存空间

                        4、无序集合 set 元素不能重复,可以用来定义唯一值

                        5、有序集合zset,元素不能重复,但是权重可以相同,用来排名

你可能感兴趣的:(redis,数据库,缓存)