Redis API的理解和使用 - Go语言中文社区

Redis API的理解和使用


一.通用命令

在这里插入图片描述

  1. key key + 类通配符
    在这里插入图片描述在这里插入图片描述

key命令一般不在生产环境使用,key多慢。

  1. dbsize
    在这里插入图片描述

dbsize 时间复杂度为O1级别,可以在生产环境中使用

  1. exists
    在这里插入图片描述

exists 时间复杂度为O1级别,可以在生产环境中使用

  1. del
    在这里插入图片描述

可以同时删除多个

  1. expire , ttl , persist
    在这里插入图片描述在这里插入图片描述
  2. type
    在这里插入图片描述
  3. 时间复杂度
    在这里插入图片描述

二. 数据结构和内部编码

在这里插入图片描述

内部有一个redisObject

在这里插入图片描述

目的:使用更小的空间实现更优内存使用效果

  1. 单线程

(1) 单线程模型
在这里插入图片描述

(2)单线程快的原因

–纯内存
–非阻塞IO
–避免线程切换和竞态消耗

(3)单线程注意

–一次只运行一条命令
–拒绝长(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate,big value

三.字符串

  1. 字符串键值结构

key 为字符串
value 可以为 字符串 数字 二进制 json对象 最大为512M

  1. 使用场景

(1)缓存
(2)计数器
(3)分布式锁 …

  1. 命令
get key    :   获取key对应的value
set key value : 设置key-value
del key  : 删除key-value

incr key       :   key自增1,如果key不存在,自增后get(key)=1
decr key      :   key自减1,如果key不存在,自减后get(key)=-1
incrby key k  : key自增k ,如果key不存在,自增后get(key) = k 
decr key k    :  key自减k,如果key不存在,自减后get(key)=-k

192.168.187.128:6382> get counter
(nil)
192.168.187.128:6382> incr counter
(integer) 1
192.168.187.128:6382> get counter
"1"
192.168.187.128:6382> incr counter
(integer) 2
192.168.187.128:6382> get counter
"2"
192.168.187.128:6382> incrby counter 99
(integer) 101
192.168.187.128:6382> get counter
"101" 

  1. 实战:记录网站每个用户个人主页的访问量
incr userid:pageview(单线程:无竞争)
  1. 缓存视频的基本信息(数据源在MySQL中)
    在这里插入图片描述

先在redis中查找,如果没有就去数据库中查找

public VideoInfo get(long id){
    String redisKey = redisPrefix + id ;
    Video videoInfo = redis.get(redisKey);
    if(videoInfo == null){
        videoInfo = mysql.get(id);
         if(videoInfo != null){
             //序列化
             redis.set(redisKey,serialize(videoInfo));
           }
     }
   }
set key value    :  不管key是否存在 都设置
setnx key value :  key不存在,才设置
set key value xx  :  key存在,才设置

192.168.187.128:6382> exists php
(integer) 0
192.168.187.128:6382> set php good
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> setnnx key java
(error) ERR unknown command 'setnnx'
192.168.187.128:6382> setnx key java
(integer) 1
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set key value java
(error) ERR syntax error
192.168.187.128:6382> set key java xx
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set php java xx
OK
192.168.187.128:6382> get php
"java"

mget key1 key2 key3 : 批量获取key,原子操作
mset key1 value1 key2 value2 key3 value3 : 批量设置key-value

  1. n次get操作和mget操作区别
    在这里插入图片描述在这里插入图片描述
getset key newvalue       :    set key newvalue 并返回旧的value
append key value           :     将value追加到旧的value
strlen key                       :     返回字符串的长度(注意中文)

192.168.187.128:6382> get php
"java"
192.168.187.128:6382> getset php ffff
"java"
192.168.187.128:6382> get php
"ffff"
192.168.187.128:6382> append php ",java"
(integer) 9
192.168.187.128:6382> get php
"ffff,java"
192.168.187.128:6382> strlen php
(integer) 9
192.168.187.128:6382> set hello "足球"
OK
192.168.187.128:6382> strlen hello
(integer) 4
incrbyfloat key 3.5                    :  增加key对应的值3.5
getrange key start end             :  获取字符串指定下标所有的值
setrange key index value          : 设置指定下标所有对应的值

192.168.187.128:6382> incr counter
(integer) 102
192.168.187.128:6382> incr times
(integer) 1
192.168.187.128:6382> incrbyfloat times 1.1
"2.1"
192.168.187.128:6382> getrange times 0 2
"2.1"
192.168.187.128:6382> setrange php 4 p
(integer) 9
192.168.187.128:6382> get php
"ffffpjava"
192.168.187.128:6382>

  1. 字符串总结
    在这里插入图片描述

四.Hash

  1. 哈希键值结构
    在这里插入图片描述在这里插入图片描述

  2. field不能相同,value可以相同

  3. 所有的API以H开头

  4. hget hset hdel

hget key field     :     获取hash key 对应的field的Values
hset key field value  : 设置hash key 对应的field的value
hdel key field  :  删除hash key 对应field的value
hgetall   :  获取所有的key和value
  1. hexists hlen
hexists key field   : 判断hash key 是否有field
hlen key    : 获取hash key field 的数量

192.168.187.128:6382> hexists user1 age
(integer) 0
192.168.187.128:6382> hexists user1 name
(integer) 1
192.168.187.128:6382> hash user1
(error) ERR unknown command 'hash'
192.168.187.128:6382> hlen user1
(integer) 1
  1. hmget hmset
hmget key field1 field2 ...fieldN    : 批量获取hash key 的一批field对应的值
hmset key field1 value1 field2 value2....fieldN valueN     : 批量设置hash key 的一批field value
  1. 实战 : 记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count
  1. 缓存视频的基本信息(数据源在mysal中)伪代码
public VideoInfo get(long id){
    String reidsKey = redisPrefix + id ;
    Map<String,String> hashMap = redis.hgetAll(redisKey);
    VideoInfo videoInfo = transferMapToVideo(hasMap);
    if(videoInfo == null){
        videoInfo = mysql.get(id);
        if(videoInfo != null){
            redis.hmset(redisKey,transferVideoToMap(videoInfo));
        }
    }
    return videoInfo;
   }
  1. hgetall hvals hkeys
hgetall key        : 返回hash key对应所有的field和value
hvals key           :返回hash key 对应所有field的value
hkeys key          : 返回hash key对应所有的field
  1. 使用hgetall 小心使用牢记单线程
  2. 如何更新用户属性

(1)使用String : key 为 用户id value 为用户对象
(2)使用String : key 为 每个用户的属性user:1:name value为属性的值world
(3)使用Hash : key为用户id , value 为hash表 ,方便修改

  1. hsetnx hincrby hincrbyfloat
hsetnx key field value    : 设置hash key对应field的value(如果field已经存在,则失败)
hincrby key field intCounter : hash key对应的field的value自增intCounter
hincrbyfloat key field floatCounter  : hincrby浮点数

五.List

  1. 列表结构
    在这里插入图片描述
  2. 特点:有序,可以重复,左右两边插入弹出
  3. 以L开头
  4. rpush
 rpush key value1 value2 .. value3   :  从列表右端插入值
lpush key value1 value2 ...value3   :  从列表左端插入值
  1. linsert
 linsert key before|after value newValue    :  在list指定的值前|后插入newValue    例:linsert listkey before b java
  1. lpop
lpop key   : 从列表左侧弹出一个item
  1. rpop
rpop key   : 从列表右侧弹出一个item
  1. lrem
lrem key count value  根据count值 从列表中删除所有value相等的项
(1)count >0  ,从左到右,删除最多count个value相等的项
(2)count <0, 从右到左,删除最多Maht.abs(count)个value相等的项
(3)count =0 ,删除所有value相等的项
  1. ltrim
ltrim key start end           :   按照索引范围修剪列表
  1. lrange
lrange key start end (包含end)        : 获取列表指定索引范围所有itme
索引从左: 0 - 5
索引从右:-1 - -6
  1. lindex
lindex key index   :   获取列表指定索引的item
  1. llen
llen key    :  获取列表长度
  1. lset
lset key index newValue     :  设置列表指定索引值为newValue

六. 集合Set

  1. 不能有重复值
  2. 集合的结构
    在这里插入图片描述
  3. 特点:无序,无重复,集合间操作
  4. sadd srem
sadd key element   :  向集合key添加element(如果element已经存在,添加失败)
srem key element   :  将集合key中的element移除掉
  1. scard sismember srandmember smembers spop
scard user:1:follow = 4  : 计算集合大小
sismember user:1:follow it = 1 :判断it是否在集合中
srandmember user:1:follow count = his : 从集合中随机挑选count个元素
spop user:1:follow = sports  : 从集合中随机弹出一个元素
smembers user:1:follow = music his sports it    : 获取集合所有元素
  1. spop从集合弹出
srandmenber不会破坏集合
  1. 实战

抽奖系统
Like,赞,踩
标签

  1. sdiff sinter sunion
sdiff user:1:follow user:2:follow = music his    :  差集
sinter user:1:follow user:2:follow = it sports    : 交集
sunion user:1:follow user:2:follow  = it music his sports news end    :  并集
sdiff|sinter|suion + store destkey      : 将差集,交集,并集结果保存在destkey中

七.有序集合zset

  1. 有序集合结构
    在这里插入图片描述
  2. 集合VS有序集合
    在这里插入图片描述
  3. 列表VS有序集合
    在这里插入图片描述
  4. zadd
zadd key score element (可以是多对)     :  添加score 和 element

192.168.187.128:6382> zadd user:1:ranking 244 tom
(integer) 1
192.168.187.128:6382> zadd user:1:ranking 214 jinm
(integer) 1
192.168.187.128:6382> zadd user:1:ranking d j
(error) ERR value is not a valid float
  1. zrem
    (1)zrem key element(可以是多个) : zrem user:1:ranking 225 tom

  2. zscore

zscore key element   : 返回元素的分数
192.168.187.128:6382> zscore user:1:ranking tom
"244"
  1. zincrby
zincrby key increScore element    :  增加或减少元素的分数
192.168.187.128:6382> zincrby user:1:ranking 4 tom
"248"
  1. zcard
zcard key                : 返回元素的总个数
192.168.187.128:6382> zcard user:1:ranking
(integer) 2
  1. zrange
zrange key start end [WITHSCORES]      : 返回指定索引范围内的升序元素(分值)
zrange user:1:ranking 1 3 withscores
  1. zrangebyscore
zrangebyscore key minScore maxScore [WITHSCORES]    :  返回指定分数范围内的升序元素
zrangebyscore user:1:ranking 90 210 withscores
  1. zcount
zcount key minScore maxScore            :  返回有序集合内在指定分数范围内的个数
zcount user:1:ranking 200 221
  1. zremrangebyrank
zremrangebyrank key start end                            : 删除指定排名内的升序元素   索引
zremrangebyrank user:1:ranking 1 2
  1. zremrangebyscore key minScore maxScore : 删除指定分数内的升序元素
zremrangebyrank user:1:ranking 90 210
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42763504/article/details/86659256
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢