初识redis
一:认识nosql:
SQL Vs NOSQL
关系型数据库 非关系型数据库
1# 结构化(数据约定,字段约束) 1#非结构化
2#关联的,关系型数据库(表关联) 2#无关联(以json格式保存,无需关联) ##比如一张表记录了用户名ID等,另一张表记录了产品id等,当用户购买了产品之后,数据表就会记录该用户ID和产品ID。这样就可以知道该用户买了哪些东西。redis是以json形式来记录该用户买了什么产品,直接存储在表内。
3#sql查询 3#非sql
sql:select id, name ,age FROM tb_user WHERE id = 1(参数) redis:get user:1 (1是参数)
4#事务ACID (是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性) 4#BASE
两者的差异(大致):(sql存储在磁盘,redis存储在内存(查询速度较高)redis扩展较为方便,sql较差)
认识redis
特征:
- 键值型,value支持多种不同数据结构,功能丰富
- 单线程,每个命令具备原子性(虽然6.0是多线程,但那时针对网路请求的,其实本质还是单线程)
- 低延迟,速度快(基于内存,IO多路复用,良好的编程)
- 支持数据持久化(定期将数据从内存持久化到磁盘)
- 支持主从集群(读写分离),分片集群(数据拆分,存到不同的节点上。存储上线提高)
- 支持多语言客户端
安装redis,并配置开机自启(centos7)
安装依赖:
yum -y install gcc tcl
软件包下载地址:Download | Redis
tar pvxf redis-7.0.5.tar.gz cd redis-7.0.5/ make && make install
默认的安装路径:/usr/local/bin目录下:
1:默认启动方式:
redis-server #直接输入,默认启动(前台启动方式,退出即停止)
2:指定配置启动:
cd /root/redis-7.0.5/
cp redis.conf redis.conf.bak
vim redis.conf
#监听的地址,默认时127.0.0.1,回导致只能在本地访问,修改为0.0.0.0则可以在任意IP访问。生产环境不设置为0.0.0.0
bind 0.0.0.0
#守护进程,修改为yes后即可在后台运行
daemonize yes
#密码,设置后访问redis必须输入密码
requirepass 123456
#redis的其他常见配置
#监听的端口
port 6379
#工作目录,默认时当前目录,也就是运行redis-server时的命令,日志,持久化等文件会保存在这个目录
dir ./
#数据库数量,设置为1,表示只是用1个库,默认有16个库,编号0-15
databases 1
#设置redis能够使用的最大内存
maxmemory 512mb
#日志文件,默认为空,不记录日志,可以指定日志文件名称
logfile "redis.log"
#使用指定文件启动
cd /root/redis-7.0.5/
redis-server redis.conf
3:配置开机自启:
vim /etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /root/redis-7.0.5/redis.conf #前面是安装后的redis-server的路径,后面是存放redis.conf的路径,这行注释不要复制进去
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#重新加载系统服务
systemctl daemon-reload
systemctl start redis
#在启动redis前需要把之前启动的redis给干掉,不然会报错。用netstat -untlp 查看redis的进程号, kill -9 +进程号 杀死进程
systemctl status redis
systemctl enable redis.service --now #配置redis的开机自启
Redis客户端
安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括:
- 命令行客户端
- 图形化桌面客户端
- 变成客户端
命令行客户端
Redis安装完成后就自带命令行客户端:redis-cli,使用方式如下:
redis-cli [options] [commonds]
#常见的options有: -h 127.0.0,1 :指定要连接的redis节点的IP地址,默认时127.0.0.1 -p 6379:指定要连接的redis节点的端口,默认是6379 -a 123456 :指定redis的访问密码
#如果不指定密码,那么进入之后需要输入 AUTH 123456 当返回OK的时候,就表示密码登录成功。
#其中commonds就是Redis的操作命令,例如: ping:与redis服务端做心跳测试,服务端正常会返回pong
#不指定commonds时,会进入redis-cli的交互控制台:
图形化桌面客户端(初使用建议使用命令行界面)
下载地址:Releases · lework/RedisDesktopManager-Windows · GitHub
图形化界面的软件包由rdm更名为resp,下载下来之后将exe软件安装。
连接完成之后显示默认的16个库,0-15。点击加号可以添加数据表。添加完表之后,在命令行界面可以使用:select 1(1表示选择哪一个数据库) get name 查看数据库的表明;
redis的数据结构介绍
redis是一个键值型数据库(key-value),key一般是String类型,不过value类型多种多样:
string 普通字符串 Hash 一个hash表 List 有序的集合,本质是一个列表 Set 是一个无序的集合,并且是不能重复的。 SortedSet 有序的集合,不能重复的。
官方帮助文档:Commands | Redis
Redis通用命令
通用命令是部分数据类型都可以使用的指令,常见的有:
- KEYS:查看符合模板的所有key 例子:(尽量不要使用生产环境使用,因为查询会阻塞其他的请求。)
redis> KEYS *name* #查询包含name的名称的表
redis> KEYS a?? #查询以a开头的名称的表
redis> KEYS * #查询所有表
- DEL:删除一个key 例子:
127.0.0.1:6379[1]> DEL k1 k2 k3 k4 k5
(integer) 3 #这个是返回的值,意思是del删除了几个key。
- EXISTS:判断key是否存在 例子: 存在返回1,不存在返回0
127.0.0.1:6379[1]> EXISTS age
(integer) 0
127.0.0.1:6379[1]> EXISTS name
(integer) 1
- EXPIRE:给key设置有效期,有效期到期时该key会被自动删除。(redis是使用内存来存储数据的,所以需要设置一个有效期来释放内存。一般用于短信验证码)
- TTL:查看一个key的剩余有效期 #当一个key的有效期为-2的时候,表示该keys已经被删除,当key的有效期为-1的时候。表示该值永久有效
String常用类型和基本用法
string类型,也就是字符串类型,是redis里面最简单的存储类型。
string类型的常见命令:
set:添加或者修改已经存在的一个seting类型的键值对
get:根据key获取string类型的value
mset:批量添加多个sting类型的键值对
mget:根据多个key获取多个string类型的value
incr:让一个整型的key自增1
incrby:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
incrbyfloat:让一个浮点类型的数字自增并指定步长
setnx:添加一个string类型的键值对,前提是这个key不存在,否则不执行
setex:添加一个string类型的键值对,并且指定有效期
key的层级格式
127.0.0.1:6379[1]> set ceshi:user:1 '{ "id":1, "name":"test1", "age":18 }' #格式不能错 127.0.0.1:6379[1]> set ceshi:user:2 '{ "id":2, "name":"test2", "age":18 }' #格式不能错 127.0.0.1:6379[1]> set ceshi:product:1 '{ "id":1, "name":"xiaomi", "proc":"2399" }' #格式不能错 127.0.0.1:6379[1]> set ceshi:product:1 '{ "id":1, "name":"xiaomi", "proc":"2399" }' #格式不能错
#当使用同一个id的时候,可以在前面增加项目业务类型等标记。当项目名一样时,创建数据库表时会默认创建一个大的文件夹(以项目名命名的文件夹)而且虽然id相同,但是因为其中的业务名不同所以也很好区分,而且数据表是以json格式保存的。
redis命令-hash类型
hash类型的常见命令:
hset key filed value:添加或者修改hash类型的key的field的值
hget key filed:获取一个hash类型的key的filed的值
hmset:批量添加多个hash类型key的filed的值
hmget:批量获取多个hash类型的key中的说有的field和value
hgetall:获取一个hash类型的key中的所有的field和value
hkeys:获取一个hash类型的key中的所有的field
hvals:获取一个hash类型的key中的所有的value
hincrby:让一个hash类型key的字段值自增并指定步长
hsetnx:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
127.0.0.1:6379[1]> HSET ceshi:user:3 name lisi
(integer) 1
127.0.0.1:6379[1]> hset ceshi:user:3 age 24
(integer) 1
127.0.0.1:6379[1]> HGET ceshi:user:3 age "24"
127.0.0.1:6379[1]> HGET ceshi:user:3 name "lisi"
127.0.0.1:6379[1]> hset ceshi:user:3 age 10
(integer) 0
127.0.0.1:6379[1]> hmset ceshi:user:4 name zhangsan age 15 sex man
OK
127.0.0.1:6379[1]> HMGET ceshi:user:4 name age sex
1) "zhangsan"
2) "15"
3) "man"
###使用hash来添加数据库的值,有个好处就是可以随意修改filed的值,且它保存的方式是hash表
list类型(保存一些有顺序的数据,例如评论,点赞等):
list常见命令:
lpush key element ...:向列表左侧插入一个或多个元素
lpop key:移除并返回列表左侧的第一个元素,没有则返回nil
rpush key element ...:向列表右侧插入一个或多个元素
rpop key:移除并返回列表右侧的第一个元素
lrange key star end:返回一段角标范围内的所有元素
blpop和brpop:与lpop和rpop类似,只不过在没有元素是等待指定时间,而不是直接返回nil
set类型
set常见命令:
sadd key member ...:向set中添加一个或多个元素
srem key member ...:移除set中的指定元素
scard key:返回set中元素的个数
sismemer key member:判断一个元素是否存在于set中
smembers:获取set中的所有元素
sinter key1 key2 ...:求key1与key2的交集
sdiff key1 key2 ...:求key1与key2的差集
sunion key1 key2 ...:求key1和key2的并集
sortedset类型:可排序的类型