- Redis是一个key-value的nosql产品,与Memcached有些类似,但它存储的value类型相对更加丰富,包括string(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)和hasg。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把内存中的数据写入到硬盘(被称为数据持久化),同时由于redis支持的value类型众多,也被称为结构化的nosql数据库。
- NoSQL产品:redis、memcache、mongoDB等特点
-
- 一般不使用严格的表结构(行和列的组合形成一个表)
- 数据的查询一般都不再使用sql查询
- 在Mac的安装Redis
- 官网下载https://redis.io/download
- 将解压后的文件放入/usr/local/控制台
- 进入文件夹:cd /usr/local/redis-5.0.4
- 编译测试:sudo make test
- 编译安装:sudo make install
- 启动redis:redis-server
- 关闭redis:redis-cli shutdown
- 启动客户端:redis-cli
- 关闭客户端:quit
- 在客户端里清屏:clear
- Redis的string类型
- 简单例子
127.0.0.1:6379> set username admin OK 127.0.0.1:6379> get username "admin" 127.0.0.1:6379>
- incr属性,会向指定key值自增1
127.0.0.1:6379> set id 1 OK 127.0.0.1:6379> get id "1" 127.0.0.1:6379> incr id (integer) 2 127.0.0.1:6379> get id "2"
- decr属性,会向指定key值自减1
127.0.0.1:6379> set id 1 OK 127.0.0.1:6379> get id "1" 127.0.0.1:6379> incr id (integer) 2 127.0.0.1:6379> get id "2" 127.0.0.1:6379> decr id (integer) 1 127.0.0.1:6379>
- incrby属性,会向指定key值自增指定数
127.0.0.1:6379> get id "1" 127.0.0.1:6379> incrby id 19 (integer) 20 127.0.0.1:6379> get id
- decrby属性,会向指定key值自减指定数
127.0.0.1:6379> get id "20" 127.0.0.1:6379> decrby id 19 (integer) 1 127.0.0.1:6379> get id "1"
- keys属性,获取redis全部的key
127.0.0.1:6379> keys * 1) "username" 2) "id"
- key如何设置
127.0.0.1:6379> set user:id:1:username admin OK 127.0.0.1:6379> set user:id:1:password admin OK 127.0.0.1:6379> set user:id:1:phone 131xx1212 OK 127.0.0.1:6379> set user:id:1:email 3xx@qq.com OK 127.0.0.1:6379> set user:id:1:register_time 2019-01-02 OK 127.0.0.1:6379> set user:id:1:root 0 OK
- key如何查看
127.0.0.1:6379> keys user:id:1* 1) "user:id:1:password" 2) "user:id:1:username" 127.0.0.1:6379> get user:id:1:username "admin"
- 简单例子
- Redis的hash类型
- 简单例子
127.0.0.1:6379> hset user username admin (integer) 1 127.0.0.1:6379> hget user username "admin"
- 设置及获取多个hash值
127.0.0.1:6379> hmset user password admin phone 13xxx email 3xx@qq.com OK 127.0.0.1:6379> hgetall user 1) "username" 2) "admin" 3) "password" 4) "admin" 5) "phone" 6) "13xxx 7) "email" 8) "3xx@qq.com"
- 简单例子
- Redis的list类型
- lpush属性,向链表的头部放入数据
127.0.0.1:6379> lpush link1 A (integer) 1 127.0.0.1:6379> lpush link1 B (integer) 2 127.0.0.1:6379> lpush link1 C (integer) 3 127.0.0.1:6379>
- rpush属性,向链表的尾部放入数据
127.0.0.1:6379> lpush link1 A (integer) 1 127.0.0.1:6379> lpush link1 B (integer) 2 127.0.0.1:6379> lpush link1 C (integer) 3 127.0.0.1:6379> keys link1
- lpop属性,移除头元素
127.0.0.1:6379> lrange link1 0 -1 1) "C" 2) "B" 3) "A" 127.0.0.1:6379> loop link1 (error) ERR unknown command `loop`, with args beginning with: `link1`, 127.0.0.1:6379> lpop link1 "C" 127.0.0.1:6379> lrange link1 0 -1 1) "B" 2) "A" 127.0.0.1:6379>
- rpop属性,移除尾元素
127.0.0.1:6379> lrange link1 0 -1 1) "B" 2) "A" 127.0.0.1:6379> rpop link1 "A" 127.0.0.1:6379> lrange link1 0 -1 1) "B"
- 使用场景
- 后台统计最近登录的10个用户
- lpush属性,向链表的头部放入数据
- Redis的set类型
- set类型被称为集合类型
- 集合是数学里面常见的一个概念,可以理解是一类数据的集合
- 特点
- 无序性:集合里面的数据是没有顺序之分
- 唯一性:集合里面的数据彼此是不能重复
- 确定性:集合里面的数据的个数是确定
- 集合常见运算
- 集合A(1,2)、集合B(2,3)
- 交集:集合公共的部分;例如上面集合A和集合B的交集是2
- 并集:集合全部的部分;例如上面集合A和集合B的并集是1,2,3
- 差集:A-B代表的含义是元素在A里面出现,但是不能在B里面出现,例如上面集合A-集合B结果是1
- sadd属性,向集合里面添加元素
127.0.0.1:6379> sadd set1 1 (integer) 1 127.0.0.1:6379> sadd set1 2 (integer) 1 127.0.0.1:6379> sadd set1 3 (integer) 1
- smenbers属性,获取集合里面的元素
127.0.0.1:6379> smembers set1 1) "1" 2) "2" 3) "3"
- srem属性,移除指定元素
127.0.0.1:6379> smembers set1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> srem set1 2 (integer) 1 127.0.0.1:6379> smembers set1 1) "1" 2) "3" 127.0.0.1:6379>
- spop属性,随机的弹出集合里面的某个元素
127.0.0.1:6379> spop set1 "3" 127.0.0.1:6379> spop set1 "1"
- sinter属性,交集
- sunion属性,并集
- sdiff属性,差集
- 应用场景:好友关系展示,例如好友推荐、共同好友
- Redis的zset类型
- zset类型被称为有序集合,
- 需要给集合里面的每个元素一个排序的权重。例如:按照1-9或者a-z排序
- zadd:添加元素
127.0.0.1:6379> zadd class:phpRank 5 mark (integer) 1
- arange:获取集合元素
127.0.0.1:6379> zrange class:phpRank 0 -1 1) "mark"
- withscores:获取集合内容的时候,显示权重信息
127.0.0.1:6379> zrange class:phpRank 0 -1 withscores 1) "mark" 2) "5"
- redis安全认证
- 设置redis密码,启动redis认证
127.0.0.1:6379> config set requirepass "root"
- 验证redis认证
127.0.0.1:6379> auto "root"
- 设置redis密码,启动redis认证
- redis的持久化功能
- redis为了本身数据的安全和完整性,会把内存中的数据按照一定的方法同步到电脑的磁盘上面,这个过程被称为持久化操作。下次再次启动redis服务的时候,会把磁盘上面的数据重新的加载到内存里面
- 常见的持久化方式
- 基于快照的方式:redis会按照一定的周期把内存里面的数据同步到磁盘文件里面
- 127.0.0.1:6379> save 900 1
- 含义:如果在900s内,对redis的key进行过一次操作,则会把内存里面的数据同步到磁盘文件
- 127.0.0.1:6379> save 300 10
- 含义:如果在300s内,对redis的key进行过十次操作,则会把内存里面的数据同步到磁盘文件
- 127.0.0.1:6379> save 60 10000
- 含义:如果在60s内,对redis的key进行过一万次次操作,则会把内存里面的数据同步到磁盘文件
- 手工的出发基于快照的持久化操作
127.0.0.1:6379> bgsave
- 保存到磁盘上到哪一个文件
#基于快照持久化保存到文件的名称 dbfilename dump.rdb # The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. # 保存到目录,默认是相对于启动文件redis-server的位置 dir ./
- 127.0.0.1:6379> save 900 1
- 基于日志文件的追加:redis会把对redis数据造成更改的命令记录到日志文件里面,然后再一次重启的时候,执行一下日志文件里面对redis写的操作,达到数据的还原
-
编辑内容
#开启基于文件追加方式的持久化操作 appendonly yes # The name of the append only file (default: "appendonly.aof") #文件的名称 appendfilename "appendonly.aof"
- 备份文件的周期
# 只要存在对redis数据造成更改的操作,都要记录到磁盘文件上 # appendfsync always # 每1s中进行一次把对redis数据造成更改的操作,都记录到磁盘文件上 appendfsync everysec # 完全交给操作系统来完成,意思就是操作系统不繁忙的时候会把对redis进行数据造成更改的操作,都记录到磁盘文件上,这种操作最不可靠 # appendfsync no
-
- 基于快照的方式:redis会按照一定的周期把内存里面的数据同步到磁盘文件里面