Redis基础(一)

Mac下安装Redis

  1. 先安装homebrew
1
“ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)”
  1. 利用homebrew安装Redis
1
brew install redis
  1. 启动Redis
1
redis-server
  1. 客户端连接Redis
1
redis-cli   //这个命令一定要另开一个终端窗口[Ctr+N]
  1. 关闭Redis服务
1
shutdown    //在客户端终端窗口里面执行

字符串类型-基础命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
set [key] [value]   //插入数据

get [key] //查看对应键名的值

keys * //查看所有键名

exists [key] //判断该键是否存在

del [key] //删除该键

type [key] //获得键值的数据类型

incr [key] //递增对应键名的键值

decr [key] //递减对应键名的键值

incrby [key] (int)num //增加指定整数

incrbyfloat [key] (float)num //增加指定浮点数

append [key] [value] //向尾部追加值,如果追加的字符串开头或结尾包含空格,需要用引号将字符串包起来

srelen [key] //获取键值的长度

mset [key1] [v1] [key2] [v2] [key3] [v3] //同时设置多个键值

mget [key1] [key3] //同时设置多个键值

竞态条件:当同一时间有多个客户端连接到Redis,对同一个键的键值同时执行递增操作,最终的键值却只增加一次

位操作

  • 获取相应二进制位上的的值
1
getbit [key] [pos]   //位置从0开始

如果需要获取的二进制位的索引超出了键值的二进制位的实际长度则默认位值是0

1
2
“redis> GETBIT foo 100000
(integer) 0”
  • 设置相应二进制位上的的值
1
setbit [key] [pos] [value]  ////位置从0开始

如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将多出的二进制位设置为0

1
2
“redis> SETBIT nofoo 10000 1
(integer) 0”

  • 获得字符串类型键中值是1的二进制位个数
1
bitcount [key]
  • “获得字符串类型键中值指定字节区间是1的二进制位个数
1
bitcount [key] (start)num (end)num
  • 对多个字符串类型键进行位运算,并将结果存储在指定的键中
1
bitop OR [result] [key1] [key2]

AND[与运算]    OR[或运算]    XOR[异或运算]

  • 获得指定键的第一个位值是0或者1的位置
1
2
3
bitpos [key] 0

bitpos [key] 1
  • 指定二进制位的查询范围,获得指定键的第一个位值是0或者1的位置
1
2
3
bitpos [key] 0 (start)num (end)num

bitpos [key] 1 (start)num (end)num

这里的返回结果的偏移量是从头开始算起的,与起始字节无关

如果不设置结束字节且键值的所有二进制位都是1,则当要查询值为0的二进制位偏移量时,返回结果会是键值长度的下一个字位的偏移量。这是因为 Redis 会认为键值长度之后的二进制位都是0。

Redis数据类型

  1. string(字符串类型)
  2. hash(散列类型)
  3. list(列表类型)
  4. set(集合类型)
  5. zset(有序集合类型

散列类型-基础命令

  • 赋值与取值
1
2
3
4
5
6
7
8
9
10
11
12
13
hset key field value
hget key field
hmset key field value [field value …]
hmget key field [field …]
hgetall key

//示例
hset car name BMW
hget car name

hmset car name BMW color white
hmget car name color
hgetall car

在Redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列类型,通过SET命令建立的键是字符串类型等等

  • 判断字段是否存在
1
hexists key field
  • 当字段不存在时赋值
1
hsetnx key field value
  • 增加数字
1
hincrby key field increment

散列类型没有 hincr 命令,但是可以通过 hincrby key field 1来实现,如果键不存在,hincrby命令会自动建立该键并默认相应字段在执行命令前的值为“0”。命令的返回值是增值后的字段值。也就是1。

  • 删除字段
1
hdel key field [field …]    //hdel命令可以删除一个或多个字段,返回值是被删除的字段个数
  • 只获取字段名或字段值
1
2
hkeys key
hvals key
  • 获得字段数量
1
hlen key

列表类型-基础命令

  • 向列表两端增加元素
1
2
lpush key value [value …] [value …] [value …]
rpush key value [value …] [value …] [value …]

示例

1
lpush numbers 1
1
1
lpush numbers 2 3
3 2 1
  • 从列表两端弹出元素
1
2
lpop key
rpop key
  • 获取列表中元素的个数
1
llen key
  • 获得列表片段
1
lrange key (stars)num (stop)num  //返回索引从 start到 stop之间的所有元素(包含两端的元素

lrange命令在取得列表片段的同时不会像lpop一样删除该片段,另外lrange返回的值包含最右边的元素

  1. 如果start的索引位置比stop的索引位置靠后,则会返回空列表。
  2. 如果stop大于实际的索引范围,则会返回到列表最右边的元素
  • 删除列表中指定的值
1
lrem key count value    //rem命令会删除列表中前count个值为value的元素,返回值是实际删除的元素个数。

根据count值的不同,lrem命令的执行方式会略有差异。

  1. 当count > 0时 lrem 命令会从列表左边开始删除前 count
  2. 当 count < 0时 lrem 命令会从列表右边开始删除前|count|个值为 value 的元素。
  3. 当 count = 0是 lrem命令会删除所有值为 value的元素。
  • 获得/设置指定索引的元素值
1
2
lindex key index
lset key index value
  • 只保留列表指定片段
1
ltrim key start
  • 向列表中插入元素
1
2
linsert key before|after pivot value
//linsert 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面
  • 将元素从一个列表转到另一个列表
1
rpoplpush source destination

当source和destination相同时,RPOPLPUSH命令会不断地将队尾的元素移到队首,借助这个特性我们可以实现一个网站监控系统

集合类型-基础命令

  • 增加/删除元素
1
2
sadd key member [member …]
srem key member [member …]
  • 获得集合中的所有元素
1
smembers key
  • 判断元素是否在集合中
1
sismembers key member
  • 集合间运算
1
2
3
sdiff key [key] [key] [key]     //求差集
sinter key [key] [key] [key] //求交集
sunion key [key] [key] [key] //求并集
  • 获得集合中元素个数
1
scard key
  • 进行集合运算并将结果存储
1
2
3
sdiffstore destination key [key …]
sinterstore destination key [key …]
sunionstore destination key [key …]
  • 随机获得集合中的元素
1
srandmember key [count]
  1. 当count为正数时,srandmember会随机从集合里获得count个不重复的元素。如果count的值大于集合中的元素个数,则srandmember会返回集合中的全部元素。
  2. 当count为负数时,srandmember会随机从集合里获得|count|个的元素,这些元素有可能相同。
  • 从集合中随机弹出一个元素
1
spop key

有序集合类型-基础命令

  • 有序集合类型在某些方面和列表类型有些相似。
  1. 二者都是有序的。
  2. 二者都可以获得某一范围的元素。
    但是二者有着很大的区别,这使得它们的应用场景也是不同的。
    1. 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
    2. 有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
    3. 列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
    4. 有序集合要比列表类型更耗费内存。
  • 增加元素
1
zadd key score member [score member …]
  • 获得元素的分数
1
zsocre key member
  • 获得排名在某个范围的元素列表
1
2
zrange key start stop [withscores]
zrevrange key start stop [withscores] //zrevrange命令是按照元素分数从大到小的顺序给出结果的

如果需要同时获得元素的分数的话可以在 ZRANGE 命令的尾部加上 WITHSCORES 参数

1
2
3
4
5
6
7
redis> zrange scoreboard 0 -1 withscores
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "David"
6) "100"

-获得指定分数范围的元素

1
“zrangebyscore key min max [withscores] [limmit offset count]
  • 增加某个元素的分数
1
zincrby key increment member

示例

1
2
zincrby scoreboard 4 Jerry  //加分
zincrby scoreboard -4 Jerry //减分
  • 获得集合中元素的数量
1
zcard key
  • 获得指定分数范围内的元素个数
1
zcount key min max
  • 删除一个或多个元素
1
zrem key member [member …]
  • 按照排名范围删除元素
1
zremrangebyrank key start stop  //从小到大的顺序
  • 按照分数范围删除元素
1
zremrangebyscore key min max

示例

1
zremrangebyscore testRem (4 5  //不包括4,但是包括5
  • 获得元素的排名
1
2
zrank key member    //从小到大
zrevrank key member //从大到小
  • 计算有序集合的交集
1
2
zinterstore destination numkeys key [key …] [weight weight [weight …]] [aggregate
SUM|MIN|MAX]

当AGGREGATE是SUM时(也就是默认值),destination键中元素的分数是每个参与计算的集合中该元素分数的和。

当AGGREGATE是MIN时,destination键中元素的分数是每个参与计算的集合中该元素分数的最小值。

当AGGREGATE是MAX时,destination键中元素的分数是每个参与计算的集合中该元素分数的最大值。

ZINTERSTORE命令还能够通过WEIGHTS参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重。