redis

146 阅读8分钟

redis

一、String 字符串

基本命令:

set  key  设置一个key​get  key   获取一个key​
exists  key   判断一个key 是否存在​
keys *    获取所有的key​
append key   key如果存在 则在后面追加字符串  如果不存在 则设置 key    
incr key  自增1
decr  key  自减 1
incrby key 步长        
127.0.0.1:6379> decr int(integer) -1
127.0.0.1:6379> decr int(integer) -2
127.0.0.1:6379> decr int(integer) -3
127.0.0.1:6379> decr int(integer) -4
127.0.0.1:6379> decr int(integer) -5
127.0.0.1:6379> decr int(integer) -6
127.0.0.1:6379> get int"-6"
127.0.0.1:6379> incr int 10(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incrby int 10   key 增加步长(integer) 4
127.0.0.1:6379> get int"4"
127.0.0.1:6379> decrby int 4(integer) 0
127.0.0.1:6379> get int"0"
127.0.0.1:6379> 
127.0.0.1:6379> get password"23456789"
127.0.0.1:6379> Getrange password   字符串长度截取  启始位置  结束位置(-1) 表示回去全部   (error) ERR wrong number of arguments for 'getrange' command
127.0.0.1:6379> Getrange password 0 3"2345"
127.0.0.1:6379> Getrange password 0 4"23456"
127.0.0.1:6379> Getrange password 0 -1"23456789"
127.0.0.1:6379> 127.0.0.1:6379> get name"lisi123"
127.0.0.1:6379> setrange name 1 xxx  字符串替换  setrange key  开始替换的位置下标  需要替换的字符串(integer) 7
127.0.0.1:6379> get name"lxxx123"
127.0.0.1:6379> 
127.0.0.1:6379> setex name 30 ddd  给key设置一个过期时间OK
127.0.0.1:6379> ttl name  查看key的过期时间(integer) 22
127.0.0.1:6379> ttl name
127.0.0.1:6379> setnx name llll  设置一个key 如果不存在则设置   如果存在就不设置(integer) 1
127.0.0.1:6379> get name"llll"
127.0.0.1:6379> setnx name 2222   (integer) 0
127.0.0.1:6379> get name"llll"
127.0.0.1:6379> 
127.0.0.1:6379> mset key1 b key2 m key3 y   批量设置一批keyOK
127.0.0.1:6379> mget key1 key2 key3     批量获取一批key1) "b"2) "m"3) "y"
127.0.0.1:6379> mget key1 key2 key31) "b"2) "m"3) "y"
127.0.0.1:6379> 
127.0.0.1:6379> mset user:1:name lisi user:2:password name  批量设置一个对象的属性 原子性操作OK
127.0.0.1:6379> mget user:1:name user:2:password   批量获取对象的全部属性1) "lisi"2) "name"
127.0.0.1:6379> 
127.0.0.1:6379> getset db mongodb   获取并设置key的值   返回key原来的值  比较并交换(nil)
127.0.0.1:6379> get db "mongodb"
127.0.0.1:6379> get db redis(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> getset db redis"mongodb"
127.0.0.1:6379> get db"redis"
127.0.0.1:6379> ​​​​​​

二、List

list 列表 一个栈、列表、队列。

所有的list 命令都以L开头 不区分大小写

127.0.0.1:6379> lpush like one  将一个或者多个值 存放在队列头部(integer) 1
127.0.0.1:6379> lpush like two(integer) 2
127.0.0.1:6379> lpush like three(integer) 3
127.0.0.1:6379> lrange like(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange like 0 -11) "three"2) "two"3) "one"
127.0.0.1:6379> 
127.0.0.1:6379> rpush like free  将一个或者多个放在队列的尾部(integer) 4
127.0.0.1:6379> lrange like 0 -11) "three"2) "two"3) "one"4) "free"
127.0.0.1:6379> lpop like   移除第一个元素"three"
127.0.0.1:6379> rpop like   移除最后一个元素"free"
127.0.0.1:6379> lindex like 1  获取下标的值"one"
127.0.0.1:6379> lindex like 2(nil)
127.0.0.1:6379> lindex like 0"two"
127.0.0.1:6379> llen like  获取队列长度(integer) 2移除只定的值   lrem  
127.0.0.1:6379> lrange like 0 -1   移除指定的值   key  个数  值1) "one"2) "one"
127.0.0.1:6379> lrem like 2 one(integer) 2
127.0.0.1:6379> lrange like 0 -1(empty array)
127.0.0.1:6379> trim  修剪   ltrim截断
127.0.0.1:6379> lpush like one1(integer) 1
127.0.0.1:6379> lpush like one(integer) 2
127.0.0.1:6379> lpush like one2(integer) 3
127.0.0.1:6379> lpush like one3(integer) 4
127.0.0.1:6379> ltrim like 1 4  截取 key  并修改keyOK
127.0.0.1:6379> lrange like 0 -1 1) "one2"2) "one"3) "one1"
127.0.0.1:6379> ###############################
127.0.0.1:6379> lrange like 0 -1  1) "one2"2) "one"3) "one1"
127.0.0.1:6379> rpoplpush like mylike  移除列表最后一个元素 添加到新列表中去"one1"
127.0.0.1:6379> lrange like 0 -11) "one2"2) "one"
127.0.0.1:6379> lset like 0 two  更新列表的某个值  不存在会报错OK
127.0.0.1:6379> linsert like before "two" "other"  将某个具体的值插入到 某个值前面或者后面(integer) 3127.0.0.1:6379> lrange like 0 -11) "other"2) "two"3) "one"127.0.0.1:6379> lrange like 0 -11) "other"2) "two"3) "one"127.0.0.1:6379> linsert like after two new(integer) 4127.0.0.1:6379> lrange like 0 -11) "other"2) "two"3) "new"4) "one"小结:他实际是一个链表 before node after left right 都可以插入值如果key 不存在 创建新链表如果key存在 新增内容如果移除了所有值 空链表 也代表不存在在两边插入或者修改值  效率最高  中间元素  效率会相当低一点

三、SET

127.0.0.1:6379> sadd like one   集合添加(integer) 0
127.0.0.1:6379> sadd like other(integer) 1
127.0.0.1:6379> smembers like  获取所有集合1) "other"2) "two"3) "one"
127.0.0.1:6379> sismember like one  判断某个值是否存在(integer) 1
127.0.0.1:6379> sismember like ss(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> scard like  获取集合的数(integer) 3
127.0.0.1:6379> srem like one   移除集合的某个值(integer) 1
127.0.0.1:6379> smembers like  1) "other"2) "two"
127.0.0.1:6379> srandmember like  随机抽取个数 的集合 "other"
127.0.0.1:6379> spop like 2  随机移除几个值1) "v2"2) "two"
127.0.0.1:6379> smove like like1 v1   移动某个元素到新集合(integer) 1共同关注 数字集合 --差集   --交集 --并集
127.0.0.1:6379> sdiff like like1   差集1) "other"2) "v5"
127.0.0.1:6379> sinter like like1   交集1) "v1"2) "v2"3) "v3"
127.0.0.1:6379> sunion like like1   并集1) "v1"2) "other"3) "v2"4) "v5"5) "v3"  ​​

四、Hash

Map集合、key-value的键值对集合

127.0.0.1:6379> hset name k1 v1  设置一个集合的值(integer) 1
127.0.0.1:6379> hget name k1     回去一个集合的值"v1"
127.0.0.1:6379> hmset name k2 v2 k3 v3   批量设置OK
127.0.0.1:6379> hmget k1 k2 k3 k4   批量获取1) (nil)2) (nil)3) (nil)
127.0.0.1:6379> hmget name k1 k2 k3 1) "v1"2) "v2"3) "v3"
127.0.0.1:6379> hgetall name  获取hash 所有的值1) "k1"2) "v1"3) "k2"4) "v2"5) "k3"6) "v3"
127.0.0.1:6379> hdel name k1  删除hash 指定的值(integer) 1
127.0.0.1:6379> hlen name  获取hash的长度(integer) 2
127.0.0.1:6379> hexists name k2  判断某个key 是否存在(integer) 1
127.0.0.1:6379> hkeys name  获取所有的key1) "k2"2) "k3"
127.0.0.1:6379> hvals name  获取所有的valus1) "v2"2) "v3"
127.0.0.1:6379> hincrby name k4 2   指定某个key自增  (integer) 4
127.0.0.1:6379> hsetnx name k4 5  如果存在则不做任何操作  不存在则设置(integer) 0
127.0.0.1:6379> hsetnx name k5 0(integer) 1​​​

hash 适合对象存储 string 适合存储字符串

五、Zset (有序集合)

在set集合上增加顺序

127.0.0.1:6379> zadd hello 2 v3   向集合里添加元素(integer) 1
127.0.0.1:6379> zadd hello 3 v2(integer) 1
127.0.0.1:6379> zrange hello 0 -1  获取集合里的所有元素1) "v1"2) "v3"3) "v2"
127.0.0.1:6379> zrange hello 0 -11) "v1"2) "v3"3) "v2"
127.0.0.1:6379> zrangebyscore hello -inf +inf  从最小值到最大值1) "v1"2) "v3"3) "v2"
127.0.0.1:6379> zrangebyscore hello -inf +inf withscores   可以指定排序范围1) "v1"2) "1"3) "v3"4) "2"5) "v2"6) "3"
127.0.0.1:6379> zrem hello v1  移除指定集合中的元素(integer) 1
127.0.0.1:6379> zrange hello 0 -11) "v3"2) "v2"
127.0.0.1:6379> zcard hello  回去集合的个数(integer) 2
127.0.0.1:6379> zrevrange hello 0 -1  反转排序1) "v2"2) "v3"
127.0.0.1:6379> zcount hello 0 4  获取指定区间的数量(integer) 3

七、geospatial

##规则: 无法添加两极geoadd  key  纬度、经度 地名有效的经纬度  
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijin(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chonqi(integer) 1
127.0.0.1:6379> geoadd china:city 114.05 22.52 sz(integer) 1
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou(integer) 1
127.0.0.1:6379> keys *1) "china:city"
127.0.0.1:6379> 
127.0.0.1:6379> geopos china:city sz   获取经纬度1) 1) "114.04999762773513794"   2) "22.5200000879503861"
127.0.0.1:6379> geodist china:city sz chonqi  获取两地的距离  "1084427.5441"
127.0.0.1:6379> geodist china:city sz chonqi km(单位)"1084.4275"

georadius 以给定坐标搜寻附近的

我附近的人

127.0.0.1:6379> georadius china:city 110 30 5000 km1) "chonqi"2) "sz"3) "hangzhou"4) "shanghai"5) "beijin"
127.0.0.1:6379> georadius china:city 110 30 5000 km withcoord1) 1) "chonqi"   2) 1) "106.49999767541885376"      2) "29.52999957900659211"2) 1) "sz"   2) 1) "114.04999762773513794"      2) "22.5200000879503861"3) 1) "hangzhou"   2) 1) "120.1600000262260437"      2) "30.2400003229490224"4) 1) "shanghai"   2) 1) "121.47000163793563843"      2) "31.22999903975783553"5) 1) "beijin"   2) 1) "116.39999896287918091"      2) "39.90000009167092543"127.0.0.1:6379> georadius china:city 110 30 5000 km withdist1) 1) "chonqi"   2) "341.9374"2) 1) "sz"   2) "924.6408"3) 1) "hangzhou"   2) "977.5143"4) 1) "shanghai"   2) "1105.9098"5) 1) "beijin"   2) "1245.2858"
127.0.0.1:6379> georadiusbymember china:city beijin 1000 km 找出位与指定 位置的元素1) "beijin"127.0.0.1:6379> georadiusbymember china:city beijin 10000 km1) "chonqi"2) "sz"3) "hangzhou"4) "shanghai"5) "beijin"127.0.0.1:6379> geohash china:city sz  当前位置的hash 值1) "ws10578st80"GEO 底层基于ZSET实现,zset命令同样适用GEO

九、Hyperloglog

什么是基数?

A(1,3,5,8,7)B(1,3,8,7)

基数(不重复的元素)=5

redis 2.8.9 版本就更新了Hyperloglog数据结构

Redis Hyperloglog 基数统计算法

优点:占用的内存是固定的 2^64不同的元素的技术 只需要12kb 内存 从内存方面首选

127.0.0.1:6379> PFadd mykey a b c d e f g h i  创建第一组元素(integer) 1
127.0.0.1:6379> pfcount mykey(integer) 9
127.0.0.1:6379> PFadd mykey2 i j z x c v b n m(integer) 1
127.0.0.1:6379> pfcount mykey2(integer) 9
127.0.0.1:6379> pfmege mykey3 mykey mykey2   合并两个组队元素(error) ERR unknown command `pfmege`, with args beginning with: `mykey3`, `mykey`, `mykey2`, 127.0.0.1:6379> pfmerge mykey3 mykey mykey2OK127.0.0.1:6379> pfcount mykey3(integer) 15127.0.0.1:6379> 

十、Bitmaps

位存储

疫情:0 0 1 0

统计用户信息 活跃 不活跃 登录 未登录 打卡 365打开

周一:0 周二

127.0.0.1:6379> pfcount mykey3(integer) 15127.0.0.1:6379> setbit sign 0 1(integer) 0127.0.0.1:6379> setbit sign 1 0(integer) 0127.0.0.1:6379> setbit sign 2 3(error) ERR bit is not an integer or out of range127.0.0.1:6379> setbit sign 2 0(integer) 0127.0.0.1:6379> setbit sign 3 0(integer) 0

查看数据

127.0.0.1:6379> getbit sign 3 (integer) 0 127.0.0.1:6379> getbit sign 2 (integer) 0 127.0.0.1:6379> getbit sign 0 (integer) 1

统计数据

127.0.0.1:6379> bitcount sign 0 0(integer) 1

事务

Redis 事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行

一次性、顺序性、排他性、执行一些列的命令!

redis 事务没有隔离级别的概念

所有的命令在事务中,并没有直接执行!只有发起执行命令的时候才会执行

Redis 单条命令保存原子性的 但是事务不保证原子性

redis 事务

开启事务 (multi)

命令入队

执行事务

127.0.0.1:6379> multi   开启事务OK127.0.0.1:6379(TX)> set k1 v1   命令入队QUEUED127.0.0.1:6379(TX)> set k2 v2QUEUED127.0.0.1:6379(TX)> exec   执行命令1) OK2) OK​

127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> set k1 v1QUEUED127.0.0.1:6379(TX)> set k3 v3QUEUED127.0.0.1:6379(TX)> set k4 v4QUEUED127.0.0.1:6379(TX)> discard   放弃事务OK127.0.0.1:6379> get k4   事务中的命令不会执行(nil)​

编译型异常(代码问题 命令有错) 事务中所有的命令都不会被执行

127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> get k4 v4(error) ERR wrong number of arguments for 'get' command127.0.0.1:6379(TX)> set k4 v4QUEUED127.0.0.1:6379(TX)> exec(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379>

运行时异常 如果事务执行发生异常 其他的命令依据会执行

127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> incr k1QUEUED127.0.0.1:6379(TX)> get k1QUEUED127.0.0.1:6379(TX)> set k1 v2QUEUED127.0.0.1:6379(TX)> exec     1) (error) ERR value is not an integer or out of range2) "v1"3) OK

监控

悲观锁

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

乐观锁

很乐观 认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下 在此时间没有其他修改。

127.0.0.1:6379> set money 100OK127.0.0.1:6379> set out 0OK127.0.0.1:6379> watch moneyOK127.0.0.1:6379> multi         事务正常执行  数据没有发生修改 OK127.0.0.1:6379(TX)> decrby money 20QUEUED127.0.0.1:6379(TX)> incrby out 20QUEUED127.0.0.1:6379(TX)> exec1) (integer) 802) (integer) 20127.0.0.1:6379> 

127.0.0.1:6379> watch moneyOK127.0.0.1:6379> multiOK127.0.0.1:6379(TX)> decrby money 10QUEUED127.0.0.1:6379(TX)> incrby out 10QUEUED127.0.0.1:6379(TX)> exec     事务执行失败    监控money 已修改(nil)127.0.0.1:6379> multi        OK127.0.0.1:6379(TX)> decrby money 1QUEUED127.0.0.1:6379(TX)> incrby out 1QUEUED127.0.0.1:6379(TX)> exec1) (integer) -212) (integer) 31127.0.0.1:6379> 修改失败----再次获取修改后值再次去修改值不断判断 一直到成功

Jedis

什么Jedis 是redis 的官方Java客户端 使用Java操作Redis中间件。