zoukankan      html  css  js  c++  java
  • Redis初识

    Redis是开源的基于键值对的服务,拥有多种数据结构,性能高。

    启动方法

    • 最简启动      redis-server
    • 动态参数启动   redis-server  --port 6380
    • 配置文件启动   redis-server  configPath

    验证方式

    ps -ef | grep redis
    netstat -antp | grep redis
    redis-cli -h ip -p port ping

    建议使用配置文件方式启动,因为redis单线程模型,服务器多核,可能一台配置多个redis,可以使用多实例配置文件的方式启动,通过端口号区分开。

    Redis 客户端

    redis-cli -h ip -p port

    状态回复  ping-->ping 

    错误回复 

     整数回复redis-cli

     字符串回复/多行字符串回复

    常用配置

    daemonize 是否是守护进程启动,默认是no,建议yes,启动日志会打印到日志当中。

    port   端口,单机多实例的时候必须配置。

    logfile  日志文件名,只是文件名

    dir   redis工作目录,日志文件以及持久化文件的存储目录

    config get *

    可以看到配置的参数是非常多的,RDB,AOF,慢查询,内存管理的配置后面再写。

    通用命令 

    keys ,dbsize   多少个key  O(1) , exists key ,expire key seconds   过期 ttl查看剩余时间   persist 去掉过期时间,del key   删除,type key  返回类型 。

    Redis是单线程一次只运行一条命令,因拒绝长命令 keys,flushall,flushdb,slow lua script,muti/exec,不过在fysnc /close file descriptor 时不是单线程。

    单线程还这么快主要是因为

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

    五大类型

    string,hash,list,set,zset,nil

    字符串

    如上图所示,字符串,他可以是字符串,整数,二进制(位图)。字符串大小限制在512M。一般建议在100k以内。

    场景 缓存、计数器、分布式锁等

    API:

    get,set,del

    incr,decr,incrby,decrby  对整数加减

    mget,mset  一次网络时间,n次命令时间

    getrange  获取范围  

    Hash

    field:value  field不能相同,所有的命令都是h开头,hash对应某个field是无法设置过期的。

    API:

    hset key field value

    hget key field value

     hdel key field

    hmget hmset

    hlen hexists

    记录每个用户页面访问量。

    List

    所有命令都是L开头,lpush,rpush,lpop,rpop, linsert,llen

    lrem list count value (从左边删除 count个 value)

    ltrim list start end 按范围修剪列表

    lrange  list start end  获取范围 包含end

    lindex list index 按索引获取

    lset list index newValue 设置

    blpop,brpop 阻塞插入弹出

    LRUSH + LPOP  = Stack

    LPUSH + RPOP = Queue

    LPUSH + LTRIM = 固定大小的列表

    LPUSH + BRPOP = 消息队列

    SET

    无序,无重复,集合间操作,操作以S开头

    sadd,sinter,sdiff,sunion 

    scard 计算集合大小

    sismember  判断是否在集合中

    srandmember 从集合中随机选择挑几个

    spop 随机弹出一个

    smembers 取出所有元素,无序,慎重使用,可能造成阻塞。

    SADD 标签

    SPOP/SRANDMEMBER 随机比如抽奖

    SADD +SINTER 社交相关的 共同好友之类的

    ZSET

    api以Z开头,有序集合,时间复杂度肯定要比集合高了。

    zadd key score element, 分数是可以重复的,元素是不可重复的  log(n)

    zrem key element 删除元素  O(1)

    zscore  key element  获取element的分数

    zincrby  key  increScore element 增加元素分数

    zcard 返回元素的个数

    zrank 从小到大

    zrange key  start end (with scores)和 lrange类似  O(log(n) + m ) 按排名

    zrangebyscore key minScore maxScore  指定分数范围内的升序元素

    zcount key minScore maxScore 分数范围内人数

    zremrangebyrank 按照rank范围 进行删除

    zrevrank,zrevrangebyscore,zrevrange, 这里是从高到低的排名

    zinterstore,zunionstore 交集和并集

    可以用于排行榜

    其他功能

    慢查询

    如keys *  , hgetall, 客户端超时不一定是慢查询,慢查询可能会导致客户端超时

    两个配置  

    1. slowlog-max-len  先进先出的队列,固定长度,保存在内存中,默认值128,不要设置过小,通常设置1000

    2. slowlog-log-slower-than  微妙,阈值执行时间, 设置小于0 不记录任何命令  默认10000微妙  10毫秒,通常设置1ms,因为redis qps是万级别的,平均是0.1ms,如果设置的过大,对qps会有影响,这个要根据实际的qps来处理。

    需要定期持久化慢查询,redis重启后会清空,持久化后可以查询历史问题

    可以通过修改配置文件重启和 config set slowlog-max-len 动态配置两种方式

    slowlog get[n] 获取慢查询队列, slowlog len 获取长度 slowlog reset 清空

    pipeline

    批量操作,一次网络时间+n次命令时间。Redis的命令时间是微妙级别,通过pipline可以减少多次操作的时候,网络的时间。

    发布订阅

    发布,所有的订阅者都会收到。如果只有一个收到则是消息队列

    redis无法做消息堆积,publish,subscribe,unsubscribe

    publish channel message

    subscribe channel  #一个或多个

    bitmap 位图

    可以操作位

    get/setbit ,

    bitcount 获取位图指定范围位置为1的个数,不带参数就是获取全部

    bitop   op  key 两个位图交并

    bitpos key targetBit   计算位图指定范围第一个偏移量对应的值等于targetBit的位置

    比如独立用户通知,1亿用户用bitmap存储  12.5MB

    bitmap是string类型,最大512M,也不是绝对的好

    hyperloglog

    HyerLogLog和bitmap一样是String类型,基于HyperLogLog算法用极小空间完成独立数量的统计,但是错误率是0.81%。

    三个命令  

    pfadd key element  添加元素

    pfcount key  计算独立总数

    pfmerge  destkey sourcekey  [sourcekey...] 合并多个hyperloglog

    GEO

    经纬度,添加地理位置,类型为zset

    geoadd  key longitude latitude member 添加经纬度

    geopos key member   获取经纬度

    geodist key member1 member2 [unit] 获取两个地理位置的距离

  • 相关阅读:
    Linux堆内存管理深入分析 (上半部)【转】
    TCMalloc小记【转】
    Linux signal 那些事儿(4)信号的deliver顺序【转】
    Linux signal 那些事儿 (3)【转】
    Linux signal那些事儿【转】
    Linux signal 那些事儿(2)【转】
    常用的Firefox浏览器插件、Chrome浏览器插件收藏
    vi 常用命令
    清除浮动新说
    【荐】万能清除浮动样式
  • 原文地址:https://www.cnblogs.com/zephyr-1/p/12673322.html
Copyright © 2011-2022 走看看