Redis基础知识

基础知识

  1. Redis默认有16个数据库,默认第0个。使用select n:进行切换数据库。
  2. Redis是一个内存中的数据结构存储系统,它可以用作数据库缓存消息中间件MQ
  3. Redis是单线程的!Redis是基于内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。
  4. Redis是将所有的数据全部放在内存中,单线程操作效率是最高的,多线程会使CPU进行上下文切换。

Redis-Key

  • keys *:查看当前数据库所有key。
  • dbsize:查看当前数据区占用空间。
  • flushdb:清除当前数据库;flushall:清除全部数据库。
  • exists key:查看是否存在指定 key ,存在返回1;不存在返回0。
  • move key n:将指定 key 移至指定数据库 n。
  • expire key time:设置指定 key 过期时间 time;ttl key:查看当前 key 剩余过期时间。
  • type key:查看 key值的数据类型。

五大基本数据类型

String(字符串)

  • append key value:在键key 后添加 值value。
  • strlen key:查看键key 长度。
  • incr key:当键key 为数字时,将当前键值加1;incrby key n:将步长设置为n,即将键值加n。
  • decr key:当键key 为数字时,将键值减1;decrby key n:将键值减n。
  • getrange key n1 n2:截取键值字符串。getrange key 0 -1:查看整个字符串。
  • setrange key n value:将key的值第n位后与value等长的字符串设置为value。
  • setex key time value:设置指定键值,并设置过期时间。
  • setnx key value:如果键key存在,则不设置;如果键key不存在,则设置为value。
  • mset k1 v1 k2 v2 ...:批量设置key-value键值对;mget k1 k2 ...:批量获取键值。
  • msetnx k1 v1 k2 v2 ...:原理同上,只不过是批量操作。原子性操作,所有设置要么一起成功,要么一起失败。
  • getset key value:先get key的值,再设置key的值为value。即进行两次单独的命令。

设置对象:

#常用语法:
set user:1 {name:qsy,age:18}    #设置一个user:1对象,值为json字符来保存一个对象
                                #这里的key是一个巧妙的设计: use:{id}:{field}

#不推荐语法:
mset user:1:name qsy user:1:age 18

List(列表)

  1. Redis可以将list用于栈、队列、阻塞队列。
  2. 所有list命令都是以 l字母 开头。
  • lpush list value1 value2:将一个或多个值插入到列表的头部。即始终插入到下标为0的位置。
  • rpush lsit value1 value2:与lpush相反,始终插入列表尾部。
  • lrange list n1 n2:获取列表指定位置范围的元素。
  • lpop list:返回并移除列表第一个元素。
  • rpop list:返回并移除列表最后一个元素。
  • lindex list n:通过下标n 获取list中的元素。
  • lset list n value:将列表下表为n的元素设置值为value。该下标必须存在元素,否则修改失败。
  • linsert list before/after value1 value2:在列表中值为value1的元素前或后插入一个值为value2的元素。若列表中有多个value1,只对第一个有效。
  • llen lsit:返回list长度。
  • lrem list count value:从下标0开始,移除count个指定list的值为value的元素。
  • ltrim list n1 n2:通过下表截取list指定长度。
  • rpoplpush:移除列表最后一个元素,并添加到另一个列表第一个元素。

小结:

List实际上是一个链表,左右都可以插入值。在两边插入或改动值,效率最高;插入或修改中间元素,效率相对较低。

Set(集合)

  1. Set是一个无序不重复集合。
  2. 所有set命令都是以 s字母开头。
  • sadd set value:向指定的set里添加value元素。
  • smembers set:查看指定set的所有值。
  • sismember set value:判断某一元素是否在set中。
  • scard set:获取set元素个数。
  • srem set value:移除set中指定元素。
  • srandmember set count:随机获取set中count个元素,count不指定默认为1。
  • spop set count:随机删除set中count个元素,count不指定默认为1。
  • smove set1 set2 value:将set1中value元素移至set2。
  • sdiff set1 set2:查找set1中所有不在set2内的元素。(即set1对set2的差集)
  • sinter set1 set2:查找set1和set2中共同的元素。(即set1对set2的交集)
  • sunion set1 set2:查找set1和set2中所有的元素。(即set1和set2的并集)

Hash(map集合)

  1. 一个Map集合(key-map),即每个键值对的值为一个map集合。
  2. 所有hash命令都是以 h字母开头。
  • hset hash key value:向指定hash添加key-value键值对。
  • hget hash key:获取指定hash的key对应的值。
  • hmset hash k1 v1 k2 v2 ...:批量设置。
  • hmget hash k1 k2 ...:批量获取。
  • hgetall hash:获取hash中所有键值对。每一个键值对单独分行显示。
  • hdel hash key:删除hash中指定键。
  • hlen hash:获取hash长度。
  • hkeys hash:获取hash中所有key。hvals hash:获取hash中所有value。
  • incrby hash key n:将hash中指定key的键值加n。
  • hsetnx hash key value:如果hash中指定key不存在,则加入键值对key-value,否则不操作。

Zset(有序集合)

  1. 在set的基础上,增加了一个score值,用于排序。
  • zadd zset n1 value1 n2 value2:向zset中添加元素。
  • zrange zset n1 n2:查询zset指定下标范围内的元素;zrange zset 0 -1:查询所有元素。
  • zrangebyscore zset -inf +inf [withscores]:对zset进行顺序排序输出。-inf+inf指定最小值和最大值。
  • zrevrangebyscore zset +inf -inf [withscores]:对zset进行降序排序输出。
  • zrem zset value:移除元素。
  • zcount zset n1 n2:获取score在区间[n1,n2]中的元素数量。

三种特殊数据类型

geospatial地理位置

  1. geo底层实现原理为zset,所以可用zset的命令进行操作。
  • geoadd key lon lat member:添加指定区域地理位置。举例:geoadd china:city 116.40 39.90 beijing。
  • geopos key member1 member2 ...:获取指定区域地理位置。举例:geopos china:city beijing anhui。
  • geodist key member1 member2 [unit]:获取两个地理位置的直线举例。unit:单位。举例:geodist china:city beijing anhui km。
  • georadius key lon lat radius m|km [withcoord] [withdist]:以指定经纬度为中心,获取半径为radius内的所有member。withcoord:显示member经纬度;withdis:显示距离。
  • georadius key member radius m|km [withcoord] [withdist]:以指定member为中心,获取半径为radius内的所有member,包括自己。

Hyperloglog

  1. Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

  2. 在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

  3. 传统网页,使用set保存用户id,然后统计set中的元素数量确定访问量。这个方式如果保存大量用户id,就会比较麻烦。我们的目的是为了计数,而不是保存用户id。

  • pfadd key v1 v2 ...:向指定key添加元素。
  • pfcount key:统计key中不重复元素数量。
  • pmerge key1 key2 key3:将key2和key3中元素合并到key1中。

Bitmaps

  1. 位存储。通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
  2. 使用场景:可以统计用户 登录/未登录、活跃/不活跃、打卡/未打卡等信息。
  3. Bitmap位图,通过操作二进制位来进行记录,只有0和1两个状态。
  • setbit key offset value:设置指定key第offset位值为value(0/1)。举例:setbit key 5 1 。
  • getbit key offset:获取指定key第offset位的值。
  • bitcount key:统计key中位值为1的数量。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343