Redis 概述
日常web开发中,一般用数据库进行存储就足够用了,因为一般的系统都不存在高并发访问情形。但是对于某些情形,一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。这时采用 Redis 可以有效应对这种情况。
NoSQL 技术
为了克服上述的问题,Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。
Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。
进入 Redis 客户端
本文主要介绍 Redis 应用,如何安装 Redis 请自行搜索。
- 进入 Redis 可客户端:redis-cli
无论是服务器直接安装还是采用 Docker 安装 Redis,都可以直接用 redis-cli 进入 Redis 客户端。
- NOAUTH Authentication required: auth password 输入密码即可
Redis 数据结构都是 key-value, key 和 value 都是字符串。
1.String 类型(键值对)
string 类型,可以是字符串(包括 XML JSON),数字(包括整型,浮点数),二进制。string 类型用于存储单个变量。
// set 键:name 值:zhangsan 过期时间:60秒
127.0.0.1:6379> set name "zhangsan" ex 60
OK
127.0.0.1:6379> get name
"zhangsan"
// set 存储 json 字符串
127.0.0.1:6379> set user "{'user':'zhangsan','age':23}" ex 120
OK
127.0.0.1:6379> get user
"{'user':'zhangsan','age':23}"
// 其他操作
127.0.0.1:6379> set name xiaozhang //设置
OK
127.0.0.1:6379> get name // 获取
"xiaozhang"
127.0.0.1:6379> del name // 删除
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set val1 100 //设置数值
OK
127.0.0.1:6379> incr val1 //自增,步调默认 1
(integer) 101
127.0.0.1:6379> incr val1
(integer) 102
127.0.0.1:6379> decr val1 //自降,步调默认 1
(integer) 101
127.0.0.1:6379> decrby val1 5 //自降,步调自定义
(integer) 96
2.Hash 哈希(存储对象)
127.0.0.1:6379> hset user name xiaoming // hset 存儲單個對象屬性
(integer) 1
127.0.0.1:6379> hget user name // hget 獲取單個對象屬性
"xiaoming"
127.0.0.1:6379> hset user name xiaohong // hset 重設一個已經存在的屬性,結果返回 0
(integer) 0
127.0.0.1:6379> hget user name // hset 重設一個已經存在的屬性,成功
"xiaohong"
127.0.0.1:6379> hsetnx user name pingping // hsetnx 增加一个元素,但不能重复
(integer) 0
127.0.0.1:6379> hsetnx user age 15
(integer) 1
127.0.0.1:6379> hmset user name xiaohe age 18 sex F // hmset 存取多个元素到hash表
OK
127.0.0.1:6379> hmget user name age // hmset 獲取多个元素
1) "xiaohe"
2) "18"
127.0.0.1:6379> hincrby hnum n1 3 // 不存在,则存储并返回 3;存在,即返回 原有值 + 3;
(integer) 3
127.0.0.1:6379> hget hnum n1
"3"
127.0.0.1:6379> hincrby hnum n1 2 // 存在,在原來基礎上 +2
(integer) 5
127.0.0.1:6379> hexists user name // hexists 判讀對象屬性是否存在
(integer) 1
127.0.0.1:6379> hexists user age
(integer) 0
127.0.0.1:6379> hkeys user // hkeys 返回hash表中的所有key
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals user // hvals 返回hash表中的所有value
1) "xiaohe"
2) "18"
3) "F"
127.0.0.1:6379> hgetall user // hgetall 獲取對象所以屬性
1) "name"
2) "xiaohong"
3) "age"
4) "15"
127.0.0.1:6379> hlen user // hlen 獲取對象屬性長度
(integer) 1
127.0.0.1:6379> hdel user sex // hdel 刪除對象某個屬性
(integer) 1
3.List 队列(存储有序可重复的字符串)
// lpush 队列头部插入,先进后出
127.0.0.1:6379> lpush list xiao001 xiao002
(integer) 7
// 查看整个队列内容
127.0.0.1:6379> lrange list 0 -1
1) "xiao002"
2) "xiao001"
3) "wang02"
4) "wang01"
5) "mmo3"
6) "mm02"
7) "mm01"
// 队列尾部插入,先进先出
127.0.0.1:6379> rpush list wei001 wei002
(integer) 9
127.0.0.1:6379> lrange list 0 -1
1) "xiao002"
2) "xiao001"
3) "wang02"
4) "wang01"
5) "mmo3"
6) "mm02"
7) "mm01"
8) "wei001"
9) "wei002"
// 队列头尾取出队列内容 lpop \ rpop
127.0.0.1:6379> lrange list 0 -1
1) "xiao002"
2) "xiao001"
3) "wang02"
4) "wang01"
5) "mmo3"
6) "mm02"
7) "mm01"
8) "wei001"
9) "wei002"
127.0.0.1:6379> lpop list
"xiao002"
127.0.0.1:6379> rpop list
"wei002"
127.0.0.1:6379> lrange list 0 -1
1) "xiao001"
2) "wang02"
3) "wang01"
4) "mmo3"
5) "mm02"
6) "mm01"
7) "wei001"
// lindex 根据队列下表索引查询队列内容
127.0.0.1:6379> lrange list 0 -1
1) "xiao001"
2) "wang02"
3) "wang01"
4) "mmo3"
5) "mm02"
6) "mm01"
7) "wei001"
127.0.0.1:6379> lindex list 0
"xiao001"
// llen 检查队列长度
127.0.0.1:6379> llen list
(integer) 7
// lset 修改已经存在的 index 内容。
127.0.0.1:6379> lrange list 0 -1
1) "xiaoming001"
2) "wang02"
3) "wang01"
4) "mmo3"
5) "mm02"
6) "mm01"
7) "wei001"
127.0.0.1:6379> lset list 0 xixo
OK
// lset 无法修改不存在的 index 内容
127.0.0.1:6379> lset list 100 bingo
(error) ERR index out of range
// linsert before|after pivot 在已经存在的值(value)前/后 插入新值
127.0.0.1:6379> linsert list after mamao mamao2
(integer) 9
127.0.0.1:6379> lrange list 0 -1
1) "mamao"
2) "mamao2"
3) "xixo"
4) "wang02"
5) "wang01"
6) "mmo3"
7) "mm02"
8) "mm01"
9) "wei001"
// ltrim 保留指定区间元素,其他元素删除
127.0.0.1:6379> lrange list 0 -1
1) "mamao2"
2) "wang02"
3) "dong11"
4) "dong22"
5) "dong33"
127.0.0.1:6379> ltrim list 0 1
OK
127.0.0.1:6379> lrange list 0 -1
1) "mamao2"
2) "wang02"
4.Set 集合(存储无序不重复的数据)
// sadd 先集合增加不重复元素
127.0.0.1:6379> sadd user u1 u2 u3
(integer) 0
// smembers 获取集合内容
127.0.0.1:6379> smembers user
1) "u2"
2) "u1"
3) "u3"
// scard 统计集合个数
127.0.0.1:6379> scard user
(integer) 3
// srandmember 随机获取集合中的元素
127.0.0.1:6379> srandmember user 2
1) "u1"
2) "u3"
// srem 删除集合中的某个元素
127.0.0.1:6379> smembers user
1) "u2"
2) "u1"
3) "u3"
127.0.0.1:6379> srem user u1
(integer) 1
127.0.0.1:6379> smembers user
1) "u2"
2) "u3"
// 交集与差集
127.0.0.1:6379> sadd foot u1 u2 u3
(integer) 3
127.0.0.1:6379> smembers foot
1) "u2"
2) "u1"
3) "u3"
127.0.0.1:6379> sadd basket u2 u3
(integer) 2
127.0.0.1:6379> smembers basket
1) "u2"
2) "u3"
127.0.0.1:6379> sinter foot basket
1) "u2"
2) "u3"
127.0.0.1:6379> sdiff foot basket
1) "u1"
5.有序集合(存储有序不重复的数据)
// zadd 增加有序集合元素 score member
127.0.0.1:6379> zadd num 10 u1 20 u2 30 u3
(integer) 3
// zrange 按 score 从小到大 获取元素
127.0.0.1:6379> zrange num 0 -1
1) "u1"
2) "u2"
3) "u3"
// zrange 按 score 从小到大 获取元素,并显示 score
127.0.0.1:6379> zrange num 0 -1 withscores
1) "u1"
2) "10"
3) "u2"
4) "20"
5) "u3"
6) "30"
// zrevrange 按 score 从大到小 获取元素
127.0.0.1:6379> zrevrange num 0 -1
1) "u3"
2) "u2"
3) "u1"
4) "u4"
// zrevrange 按 score 从大到小 获取元素,并显示 score
127.0.0.1:6379> zrevrange num 0 -1 withscores
1) "u3"
2) "30"
3) "u2"
4) "20"
5) "u1"
6) "10"
7) "u4"
8) "8"
// zscore 获取某个元素“步数”
127.0.0.1:6379> zscore num u4
"8"
// zrank 获取排名 index
127.0.0.1:6379> zrange num 0 -1
1) "u4"
2) "u1"
3) "u2"
4) "u3"
127.0.0.1:6379> zrank num u2
(integer) 2
// zrevrank 获取倒序排名 index
127.0.0.1:6379> zrevrank num u2
(integer) 1
//zincrby 增加元素“步数”
127.0.0.1:6379> zincrby num 1 u4
"9"
//zrem 删除集合中的元素
127.0.0.1:6379> zrem num u4
(integer) 1
Redis 全局命令
// info 全局信息
127.0.0.1:6379> info
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:1bc80a08306a3efd
redis_mode:standalone
os:Linux 4.15.0-63-generic x86_64
......
......
// info keyspace 查看 redis 所有数据库信息
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=7,expires=0,avg_ttl=0
db1:keys=117,expires=25,avg_ttl=2281641331
// select index 切换 redis 数据库
127.0.0.1:6379> select 0
OK
// keys * 匹配当前数据库所存储 Key 键列表
127.0.0.1:6379> keys *
......
6) "basket"
7) "foot"
8) "user"
.....
// keys *num 搜索匹配 Key 名称
127.0.0.1:6379> keys *num
1) "num"
2) "hnum"
// type key 查看 key 的类型
127.0.0.1:6379> type user
set
// ttl key 查看 Key 过期时间
127.0.0.1:6379> ttl user
(integer) -1
// 设置 key 过期时间 (秒)
127.0.0.1:6379> expire user 60
(integer) 1
127.0.0.1:6379> keys *
1) "num"
// 获取当前数据库 Key 数量
127.0.0.1:6379> dbsize
(integer) 8
// flushdb 清空当前数据库
127.0.0.1:6379[3]> flushdb
OK