侧边栏壁纸
博主头像
贾兴磊博主等级

读万卷书,行万里路。

  • 累计撰写 12 篇文章
  • 累计创建 17 个标签
  • 累计收到 2 条评论

redis杂七杂八

贾兴磊
2022-10-13 / 0 评论 / 2 点赞 / 302 阅读 / 3,297 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Redis命令


1. ping用来检查redis服务是否正常,如果返回pong表示redis服务正常 2. redis-cli 3. keys * 查看所有的键 4. get keyname 通过key名来获取数据

五大基本数据类型

string

  • set key value 设置redis键值对,key表示键名,value表示键值对应的值
  • del key [key…] 删除指定的键
  • setex key second value 设置带过期时间的key以秒为单位。
  • ttl key 用来检查指定key的剩余时间 -1表示永不过期, -2表示不存在或者已经过期。

hash哈希

  • hmset key 字段名 值 [字段名 值…] key 下面可以管理一组键值对数据
  • hget key 字段 获取key下面指定的属性
  • hdel key 字段名 删除指定key下面的字段名

List列表

  • 可以存储一组有序不唯一的数据
  • lpush key element… 向列表中push多个数据,先push的在最后
  • lrange key start stop 查找指定区间内的元素
  • lindex key index 查找指定下标的元素

set集合

  • 存储一组无序唯一的数据
  • sadd key element[elements…] 返回受影响的行数
  • SMEMBERS key 查看集合中的数据

zset有序的set集合

  • zadd key 分数 成员[分数 成员…] key是当前集合的名字 分数为double类型的,成员不允许重复 redis会根据分数的大小来对成员进行排序,最小的在最前【分数允许重复】
  • Zrange key start stop 查找指定区间内的集合成员

基础

redis默认有16个数据库,默认使用第0个,可以使用select 进行切换

clear     #清屏
127.0.0.1:6379> select 3  #切换数据库
OK
127.0.0.1:6379[3]> dbsize #查看DB数据库的大小
(integer) 0
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> keys *  # 查看数据库所有的key
1) "name"
127.0.0.1:6379[3]>  flushdb #清空当前数据库
OK
127.0.0.1:6379[3]> flushall # 清空所有数据库
OK
127.0.0.1:6379> exists name # 查看key是否存在
(integer) 1
127.0.0.1:6379> move name 1 # 移出当前key
(integer) 1
127.0.0.1:6379> expire name 30 # 设置key的过期时间
(integer) 1
127.0.0.1:6379> ttl name  # 查看当前key 的剩余时间
(integer) 26
127.0.0.1:6379> type name # 查看当前key类型
string

String(字符串)

127.0.0.1:6379> append name nb # 追加字符串,如果当前key不存在就相当于set key
(integer) 13
127.0.0.1:6379> strlen name  #获取当前字符串的长度
(integer) 13
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr  views  #自增一
(integer) 1
127.0.0.1:6379> decr views  #自减一
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> incrby views 10 # 设置步长指定增加
(integer) 11
127.0.0.1:6379> decrby views 5 # 设置步长指定减少
(integer) 6
127.0.0.1:6379> getrange key1  0 5 #截取字符串(0 -1 获取全部的字符串)
"hello,"
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 yy #替换指定位置的字符串!
(integer) 7
127.0.0.1:6379> get key2
"ayydefg"
127.0.0.1:6379> setex key3 30 "hello" # 设置key3 三十秒后过期
OK
127.0.0.1:6379> setnx mykey redis # 如果mykey不存在创建mykey
(integer) 1 
127.0.0.1:6379> setnx mykey MongoDb # 如果mykey存在,创建失败
(integer) 0
127.0.0.1:6379> mset k1 1 k2 2  k3 3  # 同时设置多个值
OK
127.0.0.1:6379> mget k1 k2 k3  # 同时获取多个值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx k1 1 k4 4 # msetnx 是一个原子性的操作,要么成功要么失败
(integer) 0
#####对象操作
127.0.0.1:6379> mset user:1:name zhanshan user:1:age 2
OK
127.0.0.1:6379> keys *
1) "user:1:age"
2) "user:1:name"
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhanshan"
2) "2"

127.0.0.1:6379> getset db redis  # 如果不存在值,则返回nil
(nil)
127.0.0.1:6379> getset db mongodb # 如果存在值,获取值并设置性的值
"redis"

list(列表)

127.0.0.1:6379> lpush list noe # 将一个值或者多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #获取list中的值
1) "three"
2) "two"
3) "noe"
127.0.0.1:6379> rpush list right # 将一个值或者多个值,插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "noe"
4) "right"
127.0.0.1:6379> lpop list #移出list的第一个元素
"three"
127.0.0.1:6379> rpop list #移出list的最后一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "noe"
127.0.0.1:6379> lindex list 0 # 通过下标获取list某一个值
"two"
127.0.0.1:6379> llen list # 获取当前list的长度
(integer) 2
127.0.0.1:6379> lrem list 1 two # 移除list指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379> ltrim list 1 2 #通过下标截取指定的长度 截取了只剩下的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello2"
2) "hello1"

127.0.0.1:6379> lrange list 0 -1
1) "hello2"
2) "hello1"
127.0.0.1:6379> rpoplpush list mylist # 移除列表最后一个元素,将他移动到新的列表中
"hello1"
127.0.0.1:6379> lrange list 0 -1
1) "hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"

127.0.0.1:6379> exists list      # 判断这个list 是否存在
(integer) 1
127.0.0.1:6379> lset list 0 item  # 修改list下标为0的值,如果下标为0的值没有的话就会报错
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"

127.0.0.1:6379> lpush list hello world
(integer) 2
127.0.0.1:6379> linsert list before world hi #将某一个具体的value插入到**前面
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hi"
2) "world"
3) "hello"
127.0.0.1:6379> linsert list after hello A #将某一个具体的value插入到**后面
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "hi"
2) "world"
3) "hello"
4) "A"

set(集合)

set中的值不能重复

127.0.0.1:6379> sadd myset hello #set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "jiazhibo"
(integer) 1
127.0.0.1:6379> sadd myset 'lovejiazhibo'
(integer) 1
127.0.0.1:6379> smembers myset #查看set中的所有值
1) "jiazhibo"
2) "hello"
3) "lovejiazhibo"
127.0.0.1:6379> sismember myset jiazhibo #判断某一个值是否在set集合中
(integer) 1
127.0.0.1:6379> scard myset  #获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379> srem myset hello #移除set集合中的指定元素
(integer) 1

127.0.0.1:6379> srandmember myset #随机抽选出一个元素
"jiazhibo"

127.0.0.1:6379> srandmember myset 2  #随机抽选出指定的个数元素
1) "jiazhibo"
2) "lovejiazhibo"

127.0.0.1:6379> spop myset   #随机移除一个元素  可以加入参数个数随机移除多少个
"lovejiazhibo"
127.0.0.1:6379> smembers myset
1) "jiazhibo"

127.0.0.1:6379> sadd myset1 hello world sanshisheng
(integer) 3
127.0.0.1:6379> sadd myset2 java
(integer) 1
127.0.0.1:6379> smove myset1 myset2 hello  #将一个指定的值,移动到另一个set集合中
(integer) 1
127.0.0.1:6379> smembers myset2
1) "hello"
2) "java"

127.0.0.1:6379> sadd key1 a b c
(integer) 3
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> sdiff key1 key2 #差集
1) "a"
2) "b"
127.0.0.1:6379> sinter key1 key2 #并集
1) "c"
127.0.0.1:6379> sunion key1 key2 #交集
1) "e"
2) "b"
3) "c"
4) "a"
5) "d"

Hash(哈希)

127.0.0.1:6379> hset myhash field1 sanshengshi #set 一个具体 key - value
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个字段值
"sanshengshi"
127.0.0.1:6379> hmset myhash field1 hello field2 world #set 多个key——value
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部的数据,
1) "field1"
2) "hello"
3) "field2"
4) "world"

127.0.0.1:6379> hdel myhash field1 #删除hash指定key字段,对应的value值也就消失了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"

127.0.0.1:6379> hmset myhash field1 heool field2 world
OK
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "heool"
3) "field2"
4) "world"
127.0.0.1:6379> hlen myhash    #获取hash表的字段数量
(integer) 2

127.0.0.1:6379> hexists myhash field1   #判断hash中的指定字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0

127.0.0.1:6379> hkeys myhash  #只获取所有的field
1) "field1"
2) "field2"
127.0.0.1:6379> hvals myhash  #只获取所有的value
1) "heool"
2) "world"

127.0.0.1:6379> hset myhash field3 5 #指定增量!
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello #如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 value # 如果存在则可以设置
(integer) 0

Zset(有序集合)

127.0.0.1:6379> zadd myset 1 one #添加一个zset值
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 three
(integer) 1
127.0.0.1:6379> zrange myset 0 -1  #查看zset集合
1) "one"
2) "two"
3) "three"

# 排序
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangshan
(integer) 1
127.0.0.1:6379> zadd salary 500 jiazhibo
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #显示全部的用户 从小到大
1) "jiazhibo"
2) "xiaohong"
3) "zhangshan"
127.0.0.1:6379> zrevrange salary 0 -1  #从大到小排序
1) "zhangshan"
2) "jiazhibo"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 显示全部的用户并且附带成绩
1) "jiazhibo"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangshan"
6) "5000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #显示工资小于2500员工的升序排序
1) "jiazhibo"
2) "500"
3) "xiaohong"
4) "2500"

127.0.0.1:6379> zrange salary 0 -1
1) "jiazhibo"
2) "xiaohong"
3) "zhangshan"
127.0.0.1:6379> zrem salary xiaohong  #移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "jiazhibo"
2) "zhangshan"

127.0.0.1:6379> zcard salary   # 获取有序集合中的个数
(integer) 2

127.0.0.1:6379> zadd myset 1 hello 2 world 3 jia
(integer) 3
127.0.0.1:6379> zcount myset 1 3  #获取指定区间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

事务

127.0.0.1:6379> multi   #开启事务
OK
# 命令入队
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> exec #执行事务
1) OK
2) OK
3) OK
4) "1"

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k4 4
QUEUED
127.0.0.1:6379> discard  #取消事务
OK
127.0.0.1:6379> get k4 # 事务中的命令都不会执行
(nil)

# 编译时异常,代码有问题,事务中的所有命令都不会被执行! 
# 运行时异常,如果事务队列中存在语法性错误,其他命令是可以执行的,错误的命令不会被执行。不保证原子性
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sett k1 1
(error) ERR unknown command 'sett'
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> exec  #执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k3
(nil)

监控 Watch

悲观锁:

​ 很悲观,认为什么时候都会出问题,无论做什么都会加锁。

乐观锁:

​ 很乐观,认为什么时候都不会出问题,所有不会上锁,跟新数据的时候去判断下,在此期间是否有人修改过这个数据

获取version

更新的时候比较version

Redis

2

评论区