redis学习笔记(1):

一、初始

1.redis特性

1.1:速度快(使用内存条内存、代码简洁而且是C语言、单线程【避免线程切换和静态资源消耗】)

1.2:持久化

1.3:多种数据结构(String、List、Set、Zset、Hash)

1.4:支持多种编辑语言

1.5:功能丰富(发布订阅、Lua脚本实现自定义功能、支持简单事务、pipeline提高客户端的并发效率)

1.6:简单(代码简洁、使用简单)

1.7:主从复制

1.8:分布式、集群高可用

2.使用场景

2.1:缓存功能

2.2:计数器

2.3:消息队列模式

2.4:排行榜

2.5:社交网络

2.6:实时系统(垃圾邮件)

3.启动方式

3.1:默认直接启动

3.2:带参数启动

3.3:指定配置文件启动

4.常用配置

4.1:端口(port)

4.2:是否设置为守护进程(建设设置为:yes)

4.3:日志文件(logdir)

4.4:文件存放地址(dir)

二、API的理解和使用

1.通用命令

1.1:keys *(罗列所有的keys、不建议使用【可在从节点使用】)、keys h*【罗列h开头的key】

1.2:dbsize(统计存在的key数量、有统计数据机制)

1.3:del key(删除指定的key,可删除多个)

1.4:exists key(判断key是否存在,不存在返回0,存在返回1)

1.5:expire key(设置key过期时间)、ttl(查看还有多长时间过期。-2表示已经过期不存在。-1表示key存在而且没有过期时间)、persist(去掉key的过期时间)

1.6:type key(判断key值的类型。String、List、Hash、Set、Zset、None【不存在key时返回】)

2.数据结构和内部编码

使用空间换时间方式:

string=》(raw、int、embstr)、hash=》(hashtable、ziplist)、list=》(linkedList、ziplist)、set=》(hashtable、intset)、zset=》(skiplist、ziplist)

redisObject存在两种数据(数据类型:type【string、list、hash、set、zset】、编码方式:encoding【raw、int、ziplist、hashtable、linkedlist、hashmap、intset】)

3.单线程

redis属於单线程模式【拒绝长命令(keys、flushall、slow lua script....)】,会出现阻塞现象

3.1:redis单线程快=》纯内存【主要原因】、非阻塞IO、避免线程切换和静态资源消耗

4.字符串(缓存、计数器、分布式锁)

4.1:命令

get key(获取key对应的值)

mget key1 key2 key3...(批量获取值,时间复杂度O(n))

mset key1 value1 key2 value2...(批量设置值,时间复杂度O(1))

set key value(设置key的值为value、不管key是否存在、都设置)

set key value nx(设置key的值为value、key不存在、才设置)

set key value xx(设置key的值为value、key存在、才设置)

incr key(#key自增1、如果key不存在、自增后get(key)=1)

decr key(#key自减1、如果key不存在、自减后get(key)=-1)

incrby key k(#key自增1、如果key不存在、自增后get(key)=k)

decrby key(#key自减k、如果key不存在、自减后get(key)=-k)

getset key newvalue(#set key newvalue并返回旧的value)

append key value(#将value追加到旧的value)

strlen key(返回字符串长度【注意中文】)

incrbyfloat key 4.5(增加key对应的值3.5)

getrange key start end(获取字符串指定下标所有的值)

setrange key index value(设置指定下标所对应值)

5.Hash

hget key field(获取hash key对应的field的value)

hset key field value(设置hash key对应的field的value)

hdel key field(删除hash key对应的field的value)

hexists key filed(判断hash key是否有field)

hlen key(获取hash key field的数量)

hgetall key(获取key下所有的field和value【牢记单线程,谨慎使用】)

hvals key(返回hash key对应所有的field的value)

hkeys key(返回kash key对应所有的field)

hmget key filed1 field2 ...fieldN(批量获取hash key的一批field对应的值【O(N)】)

hmset key field1 value1 field2 value2 ...fieldN value2(批量设置hash key的一批filed value【O(N)】)

hsetnx key field value(设置hash key对应field的value(如field已经存在,则失败))

hincrby key field intCounter(hash key对应的field的value自增的intCount)

hincrbyfloat key field floatCount(hincrby浮点数版)

6.List(有序、可重复、左右两边插入或弹出)

6.1:命令

rpush key value1 value2...valueN(从列表右端插入值(1-N个)【O(1-N)】)

lpush key value1 value2...valueN(从列表左边插入值(1-N个)【O(1-N)】)

linsert key before|afyer value newVlaue(在list指定的值前面|后面插入newVlaue【O(N)】)

lpop key (从列表左侧弹出一个item)

rpop key(从列表右侧弹出一个item)

lrem key count value(根据count值,从列表中删除所有value相等的项【1.count>0,从左到右,删除最多count个value相等的项、2.count<0,从右到左,删除最多Math.abs(count)个value相等的项、3.count=0,删除所有value相等的项】)

ltrim key start end(按照索引范围修剪列表【O(N)】)

lrange key start end(获取列表指定索引范围所有item【包含end】)

lindex key index(获取列表指定索引的item,index=-1时获取最后一个【O(N)】)

llen key(获取列表长度)

lset key index newVlaue(设置列表指定索引值为newValue【O(N)】)

blpop key timeout(lpop阻塞版本。timeout时阻塞超时时间,timeout=0永远不阻塞)

brpop key timeout(rpop阻塞版本。timeout时阻塞超时时间,timeout=0永远不阻塞)

6.2:TIPS

1.LPUSH + LPOP = STACK

2.LPUSH + RPOP = QUEUE

3.LPUSH + LTRIM = CAPPED COLLECTION

4.LPUSH + BRPOP = MESSAGE QUEUE

7.Set(无序集合=》无重复、集合间可操作、无序)

7.1:命令

sadd key elelment(向集合key添加element【如果element已经存在,添加失败】)

srem key element(将集合key中的element移除掉)

scard key(计算集合大小)

sismember key value(判断value是否存在集合中,返回1代表存在)

srandmember key count(从集合中随机挑选count个元素)

spop key (从集合中随机弹出一个元素)

smembers key(获取集合所有的元素,返回值为无需【集合中存在很多数据时,谨慎使用】)

sdiff key1 key2(两个key对应集合之间的差集)

sinter key1 key2(两个key对应集合之间的交集)

sunion key1 key2(两个key对应集合之间的并集)

sdiff|sinter|sunion + store deskey...(将差集|交集|并集结果保存在destkey中)

7.2:TIPS

1.SADD= Tagging(标签)

2.SPOP/SRANDMEMBERS = Random item(随机数)

3.SADD +SINTER = Social Graph(社交相关)

8.Zset(有序集合=》无重复、集合间可操作、有序)

zadd key score element(添加score和element,score是可以重复,element不可以重复、可以同时添加多对【O(long(n))】)

zrem key element(删除元素、可以是多个)

zscore key element(返回元素的分数)

zincrby key increScore element(增加或减少元素的分数)

zcard key(返回元素的总个数)

zrank key element(返回element排名)

zrange key start end [withscores](获取指定索引范围内的升序element[score]【O(long(n)+m)】)

zrangebyscore key minScore maxScore [withscores](获取指定分数范围内的升序element[score]【O(long(n)+m)】)

zcount keyminScore maxScore(返回有序集合内在指定分数范围内的个数【O(long(n)+m)】)

zremrangebyrank key start end(删除指定排名内的升序元素【O(long(n)+m)】)

zremrangebyscore key minScore maxScore(删除制定分数内的升序元素)

zrevrank(从高到低进行排序)

zrevrange (获取指定排序范围内)

zrevrangebyscore (给定一个分数,获取高到低的一个结果)

zinterscore (对两个集合进行交集计算)

zunionstore(对两个集合进行并集计算)

三、功能丰富

1.慢查询

1.1、慢查询发生在执行阶段;客户端发生超时不一定是慢查询引起,但是慢查询是客户端超时的一个可能

1.2、慢查询特点(1.先进先出队列、2.固定长度、3.保存在内存当中{重启之后就会消失})

1.3、两个配置

     1.3.1:slowlog-max-len(设置慢查询队列长度。默认值128)

     1.3.2:slowlog-log-slower-than(慢查询阈值,默认值10000,即10毫秒【单位:微秒】、等于0【记录所有的命令】、小于0【不记录任何命令】)

1.4、修改设置慢查询

    1.4.1:修改配置文件后进行重启

    1.4.2:config set slowlog-max-len 1000、config set slowlog-log-slower-than 1000

1.5、慢查询命令

slowlog get[n](获取慢查询队列指定条数)

slowlog len(获取慢查询队列长度)

slowlog reset(清空慢查询队列)

1.6、运维经验

    1.6.1:slowlog-max-len(不要设置过大,默认10毫秒,通常设置1ms)

    1.6.2:slowlog-log-slower-than(不要设置过小,通常设置1000左右)

    1.6.3:理解命令生命周期(发起请求、队列排队、执行命令、返回结果)

    1.6.4:定期持久化慢查询

2.pipeline(流水线,批量操作)

2.1:一次pipeline(n条命令)= 1此网络事件 + n次命令(redis的命令时间是微妙级别的)【主要控制网络时间,即使用pipeline网络时间】

2.2:pipeline不是原子操作

2.3:使用建议

    2.3.1、注意每次pipeline携带数据量

    2.3.2:pipeline每次只能作用在一个redis节点上

    2.3.3:M操作与pipeline区别

3.发布订阅(注意消息队列和发布订阅的区别、使用场景)

3.1:API命令

  publish channelName publicMessage(发布消息,返回订阅者个数)

  subscribe 【[channelName](订阅一个或多个频道) 

  unsubscribe[channelName](取消订阅一个或多个频道)

  psubscribe [patter...](根据频道模式订阅)

  punsubscribe [patter...](根据频道模式退订)

  pubsub channels(列出至少有一个订阅者的频道)

  pubsub numsub [channel...](列出给定频道的订阅者数量)

  pubsub numpat(列出被订阅模式的数量)

4.bitmap(位图)

4.1:API

  setbit key offset value(给位图指定索引设置值,offset偏移量,value只能是0或者1)

  getbit key offset(获取位图指定索引的值)

  bitcount key [start end](获取位图指定范围start到end,单位为字节,如果不指定就是获取全部)位置为1的个数

  bitop op destkey key[key...](做多个bitmap的and【交集】、or【并集】、not【非】、xor【异或】操作并将结果保存在destkey中)

  bitpos key targetBit [start] [end] (计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量队以ing的值等于targetBit的位置)

4.2:使用经验

  4.2.1、type=String, 最大512MB

  4.2.2、注意setbit时的偏移量,可能有较大耗时

  4.2.3、位图不是绝对好

5.hyperloglog

5.1:概念

5.1.1、基于hyperloglog算法:极小空间完成独立数量统计

5.1.2、本质还是字符串

5.2:API

  pfadd key element [element...](向hyperloglog添加元素)

  pfcount key [key...](计算hyperloglog的独立总数)

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

6.geo(地理信息定位,存储经纬度,计算两地距离,范围计算...)

6.1:API

  geoadd key longitude latitude member [longitude latitude member...](增加地理位置信息,longitude经度、latitude纬度、member 名称)

  geopos key member [member...](获取地理位置信息)

  geodist key member1 member2... [unit](获取两个地理位置的距离。m【米】、km【千米】、mi【英里】、ft【尺】)

  georadius key member unit(获取指定位置unit距离的范围内的地理信息集合命令...)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章