102.SQL性能优化

参考http://database.51cto.com/art/200904/118526.htm

http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html

概述

Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。本文详细介绍这五种数据类型的使用方法。本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方文档:Redis命令大全

字符串类型

字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串,包含二进制数据。可以用于存储邮箱,JSON化的对象,甚至是一张图片,一个字符串允许存储的最大容量为512MB。字符串是其他四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同而已。

基本命令

字符串操作

SET赋值,用法:SET key value

GET取值,用法:GET key

INCR递增数字,仅仅对数字类型的键有用,相当于Java的i++运算,用法:INCR key

INCRBY增加指定的数字,仅仅对数字类型的键有用,相当于Java的i+=3,用法:INCRBY key increment,意思是key自增increment,increment可以为负数,表示减少。

DECR递减数字,仅仅对数字类型的键有用,相当于Java的i–,用法:DECR key

DECRBY减少指定的数字,仅仅对数字类型的键有用,相当于Java的i-=3,用法:DECRBY key decrement,意思是key自减decrement,decrement可以为正数,表示增加。

INCRBYFLOAT增加指定浮点数,仅仅对数字类型的键有用,用法:INCRBYFLOAT key increment

APPEND向尾部追加值,相当于Java中的”hello”.append(“ world”),用法:APPEND key value

STRLEN获取字符串长度,用法:STRLEN key

MSET同时设置多个key的值,用法:MSET key1 value1 [key2 value2 ...]

MGET同时获取多个key的值,用法:MGET key1 [key2 ...]

位操作

GETBIT获取一个键值的二进制位的指定位置的值(0/1),用法:GETBIT key offset

SETBIT设置一个键值的二进制位的指定位置的值(0/1),用法:SETBIT key offset value

BITCOUNT获取一个键值的一个范围内的二进制表示的1的个数,用法:BITCOUNT key [start end]

BITOP该命令可以对多个字符串类型键进行位运算,并将结果存储到指定的键中,BITOP支持的运算包含:OR,AND,XOR,NOT,用法:BITOP OP desKey key1 key2

BITPOS获取指定键的第一个位值为0或者1的位置,用法:BITPOS key 0/1 [start, end]

散列类型

散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对,每对key,value的值个键都是字符串类型,换句话说,散列类型不能嵌套其他数据类型。一个散列类型键最多可以包含2的32次方-1个字段。

基本命令

HSET赋值,用法:HSET key field value

HMSET一次赋值多个字段,用法:HMSET key field1 value1 [field2 values]

HGET取值,用法:HSET key field

HMGET一次取多个字段的值,用法:HMSET key field1 [field2]

HGETALL一次取所有字段的值,用法:HGETALL key

HEXISTS判断字段是否存在,用法:HEXISTS key field

HSETNX当字段不存在时赋值,用法:HSETNX key field value

HINCRBY增加数字,仅对数字类型的值有用,用法:HINCRBY key field increment

HDEL删除字段,用法:HDEL key field

HKEYS获取所有字段名,用法:HKEYS key

HVALS获取所有字段值,用法:HVALS key

HLEN获取字段数量,用法:HLEN key

列表类型

列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段。列表内部使用的是双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度是O(1),获取越接近列表两端的元素的速度越快。但是缺点是使用列表通过索引访问元素的效率太低(需要从端点开始遍历元素)。所以列表的使用场景一般如:朋友圈新鲜事,只关心最新的一些内容。借助列表类型,Redis还可以作为消息队列使用。

基本命令

LPUSH向列表左端添加元素,用法:LPUSH key value

RPUSH向列表右端添加元素,用法:RPUSH key value

LPOP从列表左端弹出元素,用法:LPOP key

RPOP从列表右端弹出元素,用法:RPOP key

LLEN获取列表中元素个数,用法:LLEN key

LRANGE获取列表中某一片段的元素,用法:LRANGE key start stop,index从0开始,-1表示最后一个元素

LREM删除列表中指定的值,用法:LREM key count value,删除列表中前count个值为value的元素,当count>0时从左边开始数,count<0时从右边开始数,count=0时会删除所有值为value的元素

LINDEX获取指定索引的元素值,用法:LINDEX key index

LSET设置指定索引的元素值,用法:LSET key index value

LTRIM只保留列表指定片段,用法:LTRIM key start stop,包含start和stop

LINSERT像列表中插入元素,用法:LINSERT key BEFORE|AFTER privot value,从左边开始寻找值为privot的第一个元素,然后根据第二个参数是BEFORE还是AFTER决定在该元素的前面还是后面插入value

RPOPLPUSH将元素从一个列表转义到另一个列表,用法:RPOPLPUSH source destination

集合类型

集合在概念在高中课本就学过,集合中每个元素都是不同的,集合中的元素个数最多为2的32次方-1个,集合中的元素师没有顺序的。

基本命令

SADD添加元素,用法:SADD key value1 [value2 value3 ...]

SREM删除元素,用法:SREM key value2 [value2 value3 ...]

SMEMBERS获得集合中所有元素,用法:SMEMBERS key

SISMEMBER判断元素是否在集合中,用法:SISMEMBER key value

SDIFF对集合做差集运算,用法:SDIFF key1 key2 [key3 ...],先计算key1和key2的差集,然后再用结果与key3做差集

SINTER对集合做交集运算,用法:SINTER key1 key2 [key3 ...]

SUNION对集合做并集运算,用法:SUNION key1 key2 [key3 ...]

SCARD获得集合中元素的个数,用法:SCARD key

SDIFFSTORE对集合做差集并将结果存储,用法:SDIFFSTORE destination key1 key2 [key3 ...]

SINTERSTORE对集合做交集运算并将结果存储,用法:SINTERSTORE destination key1 key2 [key3 ...]

SUNIONSTORE对集合做并集运算并将结果存储,用法:SUNIONSTORE destination key1 key2 [key3 ...]

SRANDMEMBER随机获取集合中的元素,用法:SRANDMEMBER key [count],当count>0时,会随机中集合中获取count个不重复的元素,当count<0时,随机中集合中获取|count|和可能重复的元素。

SPOP从集合中随机弹出一个元素,用法:SPOP key

有序集合类型

有序集合类型与集合类型的区别就是他是有序的。有序集合是在集合的基础上为每一个元素关联一个分数,这就让有序集合不仅支持插入,删除,判断元素是否存在等操作外,还支持获取分数最高/最低的前N个元素。有序集合中的每个元素是不同的,但是分数却可以相同。有序集合使用散列表和跳跃表实现,即使读取位于中间部分的数据也很快,时间复杂度为O(log(N)),有序集合比列表更费内存。

基本命令

ZADD添加元素,用法:ZADD key score1 value1 [score2 value2 score3 value3 ...]

ZSCORE获取元素的分数,用法:ZSCORE key value

ZRANGE获取排名在某个范围的元素,用法:ZRANGE key start stop [WITHSCORE],按照元素从小到大的顺序排序,从0开始编号,包含start和stop对应的元素,WITHSCORE选项表示是否返回元素分数

ZREVRANGE获取排名在某个范围的元素,用法:ZREVRANGE key start stop [WITHSCORE],和上一个命令用法一样,只是这个倒序排序的。

ZRANGEBYSCORE获取指定分数范围内的元素,用法:ZRANGEBYSCORE key min max,包含min和max,(min表示不包含min,(max表示不包含max,+inf表示无穷大

ZINCRBY增加某个元素的分数,用法:ZINCRBY key increment value

ZCARD获取集合中元素的个数,用法:ZCARD key

ZCOUNT获取指定分数范围内的元素个数,用法:ZCOUNT key min max,min和max的用法和5中的一样

ZREM删除一个或多个元素,用法:ZREM key value1 [value2 ...]

ZREMRANGEBYRANK按照排名范围删除元素,用法:ZREMRANGEBYRANK key start stop

ZREMRANGEBYSCORE按照分数范围删除元素,用法:ZREMRANGEBYSCORE key min max,min和max的用法和4中的一样

ZRANK获取正序排序的元素的排名,用法:ZRANK key value

ZREVRANK获取逆序排序的元素的排名,用法:ZREVRANK key value

ZINTERSTORE计算有序集合的交集并存储结果,用法:ZINTERSTORE destination numbers key1 key2 [key3 key4 ...] WEIGHTS weight1 weight2 [weight3 weight4 ...] AGGREGATE SUM | MIN | MAX,numbers表示参加运算的集合个数,weight表示权重,aggregate表示结果取值

ZUNIONSTORE计算有序几个的并集并存储结果,用法和14一样,不再赘述。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • 概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。本文详细介绍这五种数据类型的使用...
    fang63625阅读 695评论 0 51
  • 最近学习redis,记录一下 redis官网:redis.io 中文官网:http://www.redis.net...
    alexpdh阅读 1,871评论 0 1
  • 1. redis的五大数据类型 String(字符串): String 是redis最基本的数据类型,一个key对...
    AD甜蜜蜜阅读 1,288评论 0 2
  • 本文为笔者对在学习Redis过程中所收集资料的一个总结,目的是为了以后方便回顾相关的知识,大部分为非原创内容。特此...
    EakonZhao阅读 14,435评论 0 9
  • phpredis是php的一个扩展Redis::__construct构造函数$redis = new Redis...
    hello大象阅读 763评论 0 2