Redis基本数据类型
-------------------Redis基本数据类型-------------------
1、String 字符串
1、概念
1、String 是redis最基本的类型,value 不仅可以是 String,也可以是数字;使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式);string类型是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象;string类型是Redis最基本的数据类型,一个键最大能存储512MB。
2、命令
1、set:设置key对应的值为string类型的value。
>set "name" "hello"
2、setnx(set if not exists):将key设置值为value,如果key不存在,这种情况下等同set命名;当key值存在,什么也不做。
>setnx "name" "hello"
3、setex:设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。
>setex "color" 10 "red"
>get "color" --- red
十秒过后
>get "color" --- (nil)
4、setrange:覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。
>set "email" "redis@126.com" --- "ok"
>setrange "email" 6 "gmail.com" --- (integer) 14
>get "email" --- redis@gmail.com
5、mset:一次设置多个值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置。
>mset "key1" "python" "key2" "c++" --- "ok"
>get "key1" --- "hello"
>get "key2" --- "world"
6、mget:一次获取多个key的值,如果对应key不存在,则对应返回nil。
>mget "key1" "key2" "key3"
7、msetnx:对应给定的keys到他们相应的values上。只要有一个key已经存在,msetnx一个操作也不会执行。
>msetnx "key1" "hello" "key2" "world" --- (integer) 0
8、getset:设置key的值,并返回key的旧值。
>get "name" --- "hello"
>getset "name" "newName" --- "hello"
>get "name" --- "newName"
9、getrange key start end:获取指定key的value值的字符串。是由start和end的位移决定的。
>get "name" --- "newName"
>getrange "name" 1 3 --- "ewN"
10、incr 对key的值加1 操作
>set "age" 18 --- "ok"
>incr "age" --- (integer) 19
>get "age" ---"19"
11、incrby:用incr类似,加指定值,key不存在的时候会设置key,并认为原来的value值为0。
>incrby age 5 ---(integer) 24
>incrby age1111 5 --- (integer) 5
>get age1111 --- "5"
12、decr:对key的值做的事渐减操作,decr一个不存在key,则设置key为1.
>get age --- "24"
>decr age --- "23"
13、decrby:同decr,减指定值,key不存在的时候会设置key,并认为原来的value值为1.
>get age --- "23"
>decrby age 10 --- "13"
14、append:给指定key的字符串值追加value,返回新字符串值的长度。例如我们向name的值追加一个"redis"字符串:
>set "name" "value" --- OK
>append "name" "_newValue" --- (integer) 14
>get "name" ---"value_newValue"
2、Hash 哈希
1、概念:
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象;Redis中每个hash可以存储2的32次方-1个键值对(40多亿)
2、命令:
1、hset:设置指定的hash field1。
>hset "myhash" "field1" "hello" --- (integer) 1
2、hsetnx:只在key指定的哈希集中不存在的字段时,设置字段的值。如果key指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。
>hsetnx "myhash" "field1" "hello"。 --- (integer) 1
3、hmset:同时设置hash多个field。
>hmset "myhash" "field1" "hello" "field2" "world" ---OK
4、hget:获取指定的hash值的field。
>hget "myhash" "field1" --- "hello"
5、hgetall:获取所有的hash值的数据。
>hgetall "myhash" ---
1) "field1"
2) "hello"
3) "field2"
4) "world"
6、hmget:获取hash值的多个field值。
>hmget "myhash" "field1" "field2" "field3" ---
1) "hello"
2) "world"
3) (nil)
7、hincrby:指定的hash field值,加上给定的值。
>hset "myhash" "field3" "0" --- (integer) 1
>hincrby "myhash" "field3" 1 --- (integer) 1
>hincrby "myhash" "field3" -8 --- (integer) -7
8、hexists:测试指定field是否存在。
>hexists "myhash" "field1" --- (integer) 1
>hexists "myhash" "field9" --- (integer) 0
9、hkeys:查看指定哈希中所有的key值。
>hkeys "myhash" ---
1) "field1"
2) "field2"
3) "field3"
10、hdel:从key指定的哈希集中移除指定的域。
>hdel "myhash" "field1" --- (integer) 1
11、hlen:返回指定hash的field数量。
>hlen "myhash" --- (integer) 2
12、hvals:返回指定hash中所有的value值。
>hvals "myhash" ---
1) "world"
2) "-7"
3、List 列表
1、概念:
列表类型可以存储一个有序的字符串列表,常用的操作时向列表两端添加元素,或者获得列表的某一个片段;列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(I),获取越接近两端的元素,速度就越快。
2、命令:
1、lpush:从左边向list列表中插入数据。
>lpush "mylist" "100001"
>lpush "mylist" "100002"
>lpush "mylist" "100003" "100004"
2、rpush:从右边向list列表中插入数据。
>rpush "mylist" "100005"
>rpush "mylist" "100006"
3、lpop:从列表左侧将数据弹出。
>lpop "mylist" --- "100004"
4、rpop:从列表右侧将数据弹出。
>rpop "mylist" --- "100006"
5、llen:获取列表中元素的个数。
>llen "mylist":--- (integer) 4
6、lrange key start stpo:返回索引从start到stop之间的所有元素(包含两端元素)。
>lrange "mylist" 0 -1 ---
1) "100003"
2) "100002"
3) "100001"
4) "100005"
7、lrem key count value:删除列表中前count个值为value的元素,返回删除的个数
1、count>0时 lrem 命令从列表左边开始删除前count个值为value的元素。
2、count<0时 lrem命令从列表右边开始删除前count个值为value的元素。
3、count=0时 lrem命令会删除所有值为value的元素。
>lpush "mylist" 2 2 2 --- (integer) 7
>rpush "mylist" 2 2 --- (integer) 10
>lrem "mylist" 1 2 --- (integer) 1
>lrem "mylist" -2 2 --- (integer) 2
>lrem "mylist" 0 2 --- (integer) 2
8、lindex key index:根据索引下标获取指定的列表元素。
>lindex "mylist" 1 --- "100002"
9、ltrim key start end:可以删除指定索引范围之外的所有元素,其指定列表范围的方法和lrange命令相同。
>ltrim "mylist" 0 -2 --- OK
10、linsert key before|after privot value:首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是before还是after来决定将value插入到该元素的前面还是后面,返回插入后列表元素的个数
>lrange "mylist" 0 -1 ---
1) "100003"
2) "100002"
3) "100001"
4) "100005"
>linsert "mylist" before "100003" "3"
>linsert "mylist" after "100003" "4"
1) "3"
2) "100003"
3) "4"
4) "100002"
11、rpoplpush source destination:将元素从一个列表转到另一个列表。
>rpoplpush "mylist" "mylistnew" --- "100002"
>lrange "mylistnew" 0 -1
1) "100002"
4、Set 集合
1、概念:
在集合中的每个元素都是不同的,且没有顺序。一个集合类型(set)键可以存储至多2的32次-1个字符串。集合类型的常用操作时向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现,所以这些操作的时间复杂度都是O(I)。最方便的是多个集合类型键之间还可以进行并集、交集、差集运算。
2、集合与列表的区别:
列表具有有序性,集合具有唯一性。
2、命令:
1、sadd:用来向集合中添加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中聚会忽略这个元素。
>sadd letters a ---
>sadd letters a b c ---
2、smembers key:命令会返回集合中的所有元素
>smembers letters
3、sismember key member:判断一个元素是否在集合中是一个时间复杂度为O(I)的操作,无论集合中有多少个元素,sismember命令始终可以极快的返回结果。当值存在是sismembers 命令返回1 ,当值不存在或键不存在是返回0
>sismember letters a
>sismember letters d
4、集合间运算
1、sdiff key:对多个集合执行差集运算。
>sadd setA 1 2 3
>sadd setB 2 3 4
>sdiff setA setB
>sdiff SetB setA
2、sinter key:对多个集合执行交集运算。
>sinter setA setB
3、sunion key:对多个集合执行并集运算。
>sunion setA setB
5、scard key:获取集合中元素个数。
>smembers letters
>scard letters
6、spop letters:从集合中弹出一个元素。
>spop letters
>smembers letters
5、zset(Sorted set:有序集合)
1、概念:
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入,删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素,获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素不同,但是他们的分数可以相同。
2、有序集合与列表比较:
1、相似处:
1、二者都是有序的。
2、二者都可以获得某一范围的元素。
2、区别:
1、列表类型是通过链表实现,获取靠近两端的数据速度快,当元素增加后,访问中间数据的速度会变慢。
2、有序集合类型是使用散列和跳跃表实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度O(log(N)))。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以
4、有序集合要比列表类型更消耗内存。
2、命令:
1、zadd:用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用心的分数替换原来的分数。zadd命令的返回值是新加入到集合中的元素的个数。
>zadd scoreboard 89 Tom 67 Peter 100 David --- (integer) 3
注:分数不仅是整数,还支持双精度浮点数.
2、zscore key member:获取元素的分数
>zscore scoreboard Tom --- "89"
3、zrange key start top:按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
>zrange scoreboard 0 -1
1) "Peter"
2) "Tom"
3) "David"
4、zrevrange key start top:按照元素分数从大到小的顺序放回索引从start到stop之间的所有元素
>zrevrange scoreboard 0 -1
1) "David"
2) "Tom"
3) "Peter"
5、zrangebyscore key min max:按照元素分数从小到大的顺序返回分数在min和max之间的元素。
>zrangebyscore scoreboard 85 100
1) "Tom"
2) "David"
6、zincrby key increment member:增加一个元素的分数,返回值是更改后的分数。
>zincrby scoreboard 4 Tom --- "93"