非关系型数据库redis相比于mysql数据库优缺点都很明显
优点:
- 内存数据库,读写速度比mysql快很多
- 支持数据持久化,便于备份、恢复
- 支持简单的事务,即原子性,Redis的所有操作都是原子性的
- 数据类型丰富 ,支持 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作 支持主从复制,哨兵机制
缺点:
- 数据存储在内存,容易丢失。
- 作为缓存时,存在与数据库数据不一致的问题
- 雪崩问题、缓存击穿问题、缓存并发竞争问题
String类型数据操作
-
设置key-value
>set name jack >mset name jack age 23 addr China 设置多个 >append key val 追加
2. 获取key的值
get name mget name age hobby 获取多个
127.0.0.1:6379[2]> set name Jack
OK
127.0.0.1:6379[2]> mset name Jack age 23 addr China
OK
127.0.0.1:6379[2]> get name
"Jack"
127.0.0.1:6379[2]> mget name age addr
1) "Jack"
2) "23"
3) "China"
3. 设置key时,设置过期时间
set name jack ex 10 #10s后过期
ttl name #查看多久过期:返回-2 key不存在;-1 则key存在,但没有过期时间;
或者返回具体时间
4.获取字符串值的长度
strlen name
5. 获取字符串的分片
set name jack getrange name 0 1 #包含1 -->ja
6. 设置字符串的片段值
set name beikehan setrange name 1 oo -->bookehan
7. 数值加1、减1
set age 23 incr age 只能整型数值 -->24 decr age -->23
8.数值加5、减5
set age 10 incrby age 5 增加5只能整形 decrby age 5 减去5 incrbyfloat age 1.3 转为字符串类型 incrbyfloat age -1.2
127.0.0.1:6379[2]> set age 10
OK
127.0.0.1:6379[2]> incrby age 5
(integer) 15
127.0.0.1:6379[2]> decrby age 5
(integer) 10
127.0.0.1:6379[2]> incrbyfloat age 1.3
"11.30000000000000071"
127.0.0.1:6379[2]> incrbyfloat age -1.2
"10.10000000000000142"
字符串的使用场景
-
作为缓存;并发计数,点赞、秒杀
-
带有效期的验证码,过期自动删除
List类型
Redis列表是简单的字符串列表
插入列表
# 头插法 lpush key val1 val2 ... 127.0.0.1:6379> lpush numbers 1 2 3 (integer) 3 # 尾插法 127.0.0.1:6379> rpush numbers 8 9 0 (integer) 6
更新列表
# 修改某下标的值 lset key index val 127.0.0.1:6379> lset numbers 5 10 OK
删除列表
# 头删法 lpop key # 删除第一个值, 并立即返回该值 127.0.0.1:6379> lpop numbers "3" # 尾删法 rpop key # 删除最后一个值, 并立即返回 127.0.0.1:6379> rpop numbers "10" # 删除指定的值 lrem key count value # 返回的是删除的个数 127.0.0.1:6379>lrem numbers 0 2 # 删除所有值为2的元素 (integer) 4 127.0.0.1:6379>lrem numbers -2 1 # 从表尾开始删除2个值为1的元素 (integer) 2 127.0.0.1:6379> lrem numbers 2 1 # 从表头开始删除2个值为1的元素 (integer) 2 # 截取数据 ltrim key start stop 127.0.0.1:6379> ltrim numbers 2 5 # 保留下标为 【2,5】之间的所有元素,删除其余元素
查询列表
lrange key start stop # 返回指定区间内的内容 127.0.0.1:6379> lrange numbers 0 -1 llen key #获取列表的长度
127.0.0.1:6379[2]> lpush numbers 1 2 3
(integer) 3
127.0.0.1:6379[2]> rpush numbers 8 9 0
(integer) 6
127.0.0.1:6379[2]> lset numbers 5 10
OK
127.0.0.1:6379[2]> llen numbers
(integer) 6
127.0.0.1:6379[2]> lrange numbers 0 -1
1) "3"
2) "2"
3) "1"
4) "8"
5) "9"
6) "10"
Hash
hash 特别适合用于存储字典数据。
插入哈希
# 设置单个 hset key field value 127.0.0.1:6379> hset user:123 name jack (integer) 1 # 设置多个 hmset key field value [field2 value2] # 同时将多个 field-value (域-值)对设置到哈希表中; #键和字段存在时,属于更新 127.0.0.1:6379> hmset user:123 name xiaomi age 23 gender man # 存储用户123的个人信息{'name': 'xiaomi', 'age': 23, 'gender': '男'} (integer) 3 hincrby key field increment # 为哈希表 key 中的指定字段的整数值加上增量 127.0.0.1:6379> hincrby user:123 age 5 # 用户123的年龄加5岁 (integer) 24
查询哈希
hget key field #指定字段的值 127.0.0.1:6379> hget user:123 name "xiaomi" hgetall key # 获取所有字段和值 127.0.0.1:6379> hgetall user:123 1) "name" 2) "xiaomi" 3) "age" 4) "24" 5) "gender" 6) "man" hkeys key #获取所有的字段 hvals key #获取所有的值
删除哈希
hdel key field1 [field2] # 删除一个或多个哈希字段, 返回删除的个数 127.0.0.1:6379> hdel user:123 gender # 用户123的性别 (integer) 1
Hash类型练习
-
更新用户123 的购物车中id为3的商品数量
-
修改用户123的购物车中id为3的商品数量为5个
-
获取用户123的所有购物车数据
-
删除用户123的购物车中id为3的商品
127.0.0.1:6379> hincrby cart_123 3 5 (integer) 5 127.0.0.1:6379> hincrby cart_123 3 -2 (integer) 3 127.0.0.1:6379> hset cart_123 3 5 (integer) 0 127.0.0.1:6379> hgetall cart_123 1) "3" 2) "5" 127.0.0.1:6379> hdel cart_123 3 (integer) 1
Set
Set 是 String 类型的无序的容器结构。集合成员是唯一的,不能出现重复的数据。
插入集合
sadd key member1 [member2] # 向集合添加一个或多个成员 127.0.0.1:6379> sadd workers tom lucy jack (integer) 3
删除集合
srem key member1 [member2] # 移除集合中一个或多个成员 127.0.0.1:6379> srem workers tom (integer) 1
查询集合
scard key # 获取集合的成员数 127.0.0.1:6379> scard workers (integer) 3 smembers key # 返回集合中的所有成员 127.0.0.1:6379> smembers workers 1) "tom" 2) "jack" sismember workers tom # 判断是否集合中的成员
Set类型的练习
- 选中用户123 购物车中id为3的商品
- 取消选中用户123 购物车中id为3的商品
- 查询用户123购物车中所有选中的商品
- 查询用户123购物车中所有选中的商品个数
127.0.0.1:6379> sadd cart_selected_123 3
(integer) 1
127.0.0.1:6379> srem cart_selected_123 3
(integer) 1
127.0.0.1:6379> smembers cart_selected_123
1) "3"
127.0.0.1:6379> scard cart_selected_123
(integer) 1
Zset
String 类型元素的有序集合,每个元素唯一且都会关联一个 double 类型的分值,根据分值来为集合中的成员从小到大排序。
插入有序集合
# zadd key score1 member1 [score2 member2] # 向有序集合添加一个或多个成员,或者更新已存在成员的分数 127.0.0.1:6379> zadd salary 10000 Jim 8000 Tom 12000 JiMi 10000 Hake (integer) 1
删除有序集合
zrem key member [member ...] # 移除有序集合中的一个或多个成员 127.0.0.1:6379> zrem salary Hake # 删除员工Hake (integer) 1 # zremrangebyrank key start stop # 根据排名区间【0,3】 删除成员,区间根据索引删除 127.0.0.1:6379> zremrangebyrank salary 1 2 (integer) 2 127.0.0.1:6379> zrange salary 0 -1 1) "dandan" zremrangebyscore key min max # 根据分数区间【10,30】删除成员 127.0.0.1:6379> zremrangebyscore salary 10 30 (integer) 2 127.0.0.1:6379> zrange salary 0 -1 1) "liuyang" 2) "dandan"
更新有序集合
zincrby key increment member # 对指定成员的分数加上增量 increment 127.0.0.1:6379> zincrby salary 300 Jim # 给员工Jim涨300元薪资 "10300"
查询有序集合
zcard key #有序集合的所有成员数 zcount key min max # 统计在指定分数区间的成员数 zrank key member # 返回指定成员的排名 zrevrank key member #分值降序排序后的 排名 zscore key member # 返回成员的分数值 zrange key start stop [WITHSCORES] # 返回有序集合指定索引区间内的成员 zrevrange key start stop [WITHSCORES] # 分值降序后获取索引区间的成员 zrangebyscore key min max [WITHSCORES] [LIMIT] # 返回指定分数区间内的成员 zrevrangebyscore key max min [withscores] # 返回有序集中指定分数区间内的成员,分数从高到低
有序集合练习
成员的分数 查询所有成员 返回指定成员的排名 分值降序排序后的 排名 查询指定成员的薪资 返回有序集合指定索引区间内的成员(及薪资) 查询所有员工以及对应得薪资 查询所有员工以及对应得薪资,按照薪资降序展示
127.0.0.1:6379> zadd salary 10000 Jim 8000 Tom 12000 JiMi 10000 Hake
(integer) 1
127.0.0.1:6379> zcard salary
(integer) 4
127.0.0.1:6379> zrank salary Tom
(integer) 0
127.0.0.1:6379> zrevrank salary Tom
(integer) 2
127.0.0.1:6379> zscore salary Tom
"8000"
127.0.0.1:6379> zrange salary 0 -1
1) "Tom"
2) "Jim"
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "Tom"
2) "8000"
3) "Jim"
4) "10300"
127.0.0.1:6379> zrevrange salary 0 -1 withscores
1) "JiMi"
2) "12000"
3) "Jim"
4) "10300"
5) "Tom"
6) "8000"
127.0.0.1:6379> zrangebyscore salary 8000 20000
1) "Tom"
2) "Hake"
3) "Jim"
4) "JiMi"
127.0.0.1:6379> zrangebyscore salary 8000 20000 limit 2 1 withscores
1) "Jim"
2) "10300"
127.0.0.1:6379> zrevrangebyscore salary 20000 8000
1) "JiMi"
2) "Jim"
3) "Tom"
127.0.0.1:6379> zrevrangebyscore salary 20000 8000 limit 2 1 withscores
1) "Tom"
2) "8000"