redis学习笔记(一)

来源:互联网 发布:淘宝卖家服务助手 编辑:程序博客网 时间:2024/04/26 11:05

redis简要学习笔记(内容来自Redis入门指南,感谢原书作者)

Redis是非关系型数据库。

JS------JSSO格式:键值是存储。

php中,数组是以key-value存储。

NoSQL使用场景:

1.对数据高并发读写;

2.对海量数据的高效存储和访问;

3.对数据的高可扩展性和高可用性。

Redis支持的数据类型:string,hash,list(链表),set(集合),zset(有序集合)。

Redis使用场合:

1.取最新N个数据的操作;

2.排行榜应用,取TOP N操作;

3.需要精确设定过期时间的应用(如竞拍等);

4.计数器应用;

5.Uniq操作,获取某段时间所有数据排重值;

6.实时系统

7.构建实时消息系统(Pub/sub),发布订阅;

8.构建栈、队列;

9.缓存。

redis与mysql不同:

1.两者均有库的概念;2.redis无表、无行、无列,而mysql有。

string:

set/get/senx/setex/setrange(替换)/mset/msetnx/mget/getset(获取key旧值,并设置新值)/GETRANGE(GETRANGE NAME 0 4,获取NAME的[0~4]字符)

/INCR/INCRBY/DECR/DECRBY/APPEND/STRLEN

HASH:

redis的hash是string类型的filed和alue,即:hset key-name filed value

保存用户的信息较方便。

HSET/HGET/HSETNX/HMSET/HMGET(获取同一个key的所有字段的值)/HINCRBY/HEXISTS/HLEN(返回键的filed个数)/HDEL(删除对应的filed)/HKEYS(返回所有的字段)/HVALUES(返回hash表的所有value)/HGETALL(同时返回所有字段及其对应的值)


一.命令

1.自增:incr, incr foo 1  foo=1;  返回值是变量增加后的值

    incrby需要加递增的进阶值,如incrby too 5 too=5  

2.自减:decr, decr foo 1 foo=-1;  返回值是变量减少后的值

    decrby 需要加递减的进阶值,如decrby too -5 too=-5

3.增加指定浮点数:incrbyfloat bar 2.7  bar=2.7  ;返回值是变量增加后的值

4.向尾部追加值append,append返回值是追加后字符串的总长度  

set key hello  key => hello

append key "world" key => helloworld

5.获取字符串的长度:strlen返回值是键值的长度

strlen key  => 10   (key=> helloworld)

6.同时获得/设置多个键值:mset命令

mset key1 v1 key2 v2 key3 v3

mget key1  key2 key3,输出为:1):"v1" 2)"v2" 3)"v3"

get key1 => v1

7.位操作

getbit/setbit/bitcount/bitop

如set foo bar,bar的三个字母对应的ASCII码分别为98、97和114,转换成二进制分别为11000010、11000001和01110010

getbit命令可以获得第一个字符串类型键指定位置的二进制位的值(0或1)。getbit foo 0  输出0;getbit foo 6 输出1;如果需要获取的二进制位的值,超过了二进制自身的长度,则返回0。

setbit命令设置字符串对应比特位的值为1或者0. setbit foo 6 0;setbit foo 7 1;get foo 输出 aar

bitcount命令可以获得字符串类型键中值是1的二进制个数。 bitcount foo  10 输出10;bitcount foo 0 1,统计前两个字节中键值是1的个数。

bitop命令可以对多个字符串类型键值进行位运算,并将结果存储在destkey指定的键中。如:

set foo1 bar;set foo2 aar; bitop or res foo1 foo2, get res 输出car。

二、散列类型


1.命令: HSET key filed value

HGET key filed

GMSET key filed value filed value

HMGET key filed filed

HGETALL key


redis 127.0.0.1:6379> HSET car price 500
(integer) 1
redis 127.0.0.1:6379> hset car name bmw
(integer) 1
redis 127.0.0.1:6379> HGET car name
"bmw"

redis 127.0.0.1:6379> HSET car price 500
(integer) 0
redis 127.0.0.1:6379> HSET car price 1000
(integer) 0
redis 127.0.0.1:6379> HGET car name
"bmw"
redis 127.0.0.1:6379> HGET car price
"1000"

HSET不区分插入和更新。如果是执行插入操作(之前不存在对应的key)时,HSET命令返回1;如果执行的是更新操作(之前存在对应的key),HSET命令返回0.

注释:在Redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列型,通过SET命令建立的键是字符串类型。使用一种类型数据操作另一种数据类型的键会提示错误。

当需要设置多个字段的值时候,可以使用HMSET命令。

HMSET key filed1 value1 filed2 value2

HMGET命令可以同时获得多个字段的值

redis 127.0.0.1:6379> HMGET car price name
1) "1000"
2) "bmw"

如果想获得键中所有的字段或者所有的值,但是却不知道有哪些字段时,可以使用HGETALL命令,如:

redis 127.0.0.1:6379> HGETALL car
1) "price"
2) "1000"
3) "name"
4) "bmw"

2.判断字段是否存在

HEXISTS命令用来判断一个字段是否存在。如果存在则返回1,否则返回0.

redis 127.0.0.1:6379> HEXISTS car price
(integer) 1
redis 127.0.0.1:6379> HEXISTS car model
(integer) 0

3.当字段不存在时赋值

HSETNX命令,HSETNX key ,failed, value   如果字段已经存在,HSETNX将不执行任何操作。

4.增加数字

redis 127.0.0.1:6379> HINCRBY  person score 60
(integer) 60
redis 127.0.0.1:6379> hget  person score 
"60"

之前的person键不存在,HINCRBY命令会自动建立该键,并默认score在命令执行前的值为0.命令的返回值,是增值后的字段值。HINCRBYFLOAT是增加浮点数值。

5.删除字段

redis 127.0.0.1:6379> HINCRBYFLOAT person score 15.43
"75.43"
redis 127.0.0.1:6379> HDEL person score
(integer) 1

HDLE命令可以删除一个或多个字段,返回值是被删除的字段的个数。

6.只获取字段名或者字段值

HKEYS key   ;仅获取键中所有字段的名字而不需要字段的值

HVALS key   ;仅获得键中所有字段值

redis 127.0.0.1:6379> HKEYS car
1) "price"
2) "name"

redis 127.0.0.1:6379> HVALS car
1) "1000"
2) "bmw

7.获得字段数量  HLEN key

redis 127.0.0.1:6379> HLEN car
(integer) 2

三、列表类型

LIST类型(链表):既可以作为队列,又可以作为栈,同时也可以作为双向:既近也出。

LPUSH(从头部压入元素)/RPUSH(从尾部压入元素):都是从头开始取(从左边取),从两端对链表进行操作

redis 127.0.0.1:6379> LPUSH mylist hello //(先近的是world)
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist world //(后近的是hello)
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "world"
2) "hello"

先近后出:栈。


redis 127.0.0.1:6379> RPUSH list hello

(integer) 1
redis 127.0.0.1:6379> RPUSH list world
(integer) 2
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"

先近先出:队列


如果想从中间插入某个元素:

LINSERT(从中间插入元素)

下例子是先压入one,再压入two,如果想在中间压入three,则:

redis 127.0.0.1:6379> LPUSH list3 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list3 two
(integer) 2
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "one"
redis 127.0.0.1:6379> LINSERT list3 before one three //(没有rinsert)
(integer) 3
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "three"
3) "one"

LSET: 设定指定下标元素的值为value

redis 127.0.0.1:6379> LPUSH list5 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list5 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list5 three
(integer) 3
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
3) "one"
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LSET list5 1 "new world"
OK
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "new world" //更改成功
3) "one"

LREM:(从key对应的list中删除n个和value相同的元素,n<0,从尾删,n=0全部删除对应的key,n>0.,从左侧头部删除)

LREM list5 3 one //从list5中删除3个one


LTRIM:(删除一定范围的元素)

LTRIM list8  1  -1 //保留1,-1位置元素,其他都删除。

redis 127.0.0.1:6379> LPUSH list8 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list8 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list8 three
(integer) 3
redis 127.0.0.1:6379> LPUSH list8 four
(integer) 4
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
redis 127.0.0.1:6379> LTRIM list8 1 2
OK
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "three"
2) "two" //只剩下1,2位置的three,two;其他的value都删除。

LPOP/LPUSH:从list的头部删除/添加一个元素;RPOP/LPUSH:从尾部弹出/添加一个元素。

rpoplpush:从第一个list的尾部移除元素并添加到第二个list的头部

示例:

redis 127.0.0.1:6379> LPUSH mylist5 hello
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist5 three
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
2) "hello"
redis 127.0.0.1:6379> LPUSH mylist6 foo
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist6 hello
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> RPOPLPUSH mylist5 mylist6
"hello"
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
redis 127.0.0.1:6379> LRANGE mylist6  0 -1
1) "hello"
2) "hello"
3) "foo"

LINDEX:返回名称为key的list中Index位置的元素

LLEN:返回list中元素的长度。




1.向列表两端增加元素

LPUSH 用来向列表左边增加元素,返回值表示增加元素后列表的长度。

redis 127.0.0.1:6379> LPUSH numbers 1
(integer) 1

numbers中的元素为:【1】

LPUSH还支持同时增加多个元素,

redis 127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3

操作之后,numbers中的元素为【3 2 1】

向列表中右边加如元素,为RPUSH,(以当前列表中第0个元素为基准)

redis 127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5

此时表中元素为:【3 2 1 0 -1】

2.从列表两端弹出元素

LPOP key ;从列表左边弹出一个元素,返回值是被删除的元素值

RPOP key ;从列表右边弹出一个元素,返回值是被删除的元素值

redis 127.0.0.1:6379> LPOP numbers
"3"

redis 127.0.0.1:6379> RPOP numbers
"-1"

LPUSH/RPUSH/LPOP/RPOP这4个命令,可以使用列表类型来模拟栈和队列操作:如果想把列表当作栈,则搭配使用LPUSH/LPOP或RPUSH/RPOP;如果想当成队列,则搭配LPUSH/RPOP或RPUSH/LPOP使用。

3.获取列表中元素的个数

LLEN key  ;当键不存在时,会返回0,如果键存在,则返回键的个数。

redis 127.0.0.1:6379> LLEN numbers
(integer) 3

4.获得键的片段

LRANGE key star stop ;获取列表中的某一片段,返回值是索引从start到stop之间所有元素(包括两端元素,闭集);它支持负索引,表示从右边开始计算序数。(已从左边开始计算为基准,如果值>=0时)

redis 127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"

redis 127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"

其中“-1”表示最右边的第一个元素,“-2“表示最右边第二个元素。

通过LRANGE numbers 0 -1 ;获取列表中所有元素

redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"

5.删除列表中指定的值

redis 127.0.0.1:6379> LRANGE numbers  0 -1
1) "2"
2) "1"
3) "0"
4) "100"
5) "2"

redis 127.0.0.1:6379> LREM numbers -1 2
(integer) 1
redis 127.0.0.1:6379> LRANGE numbers  0 -1
1) "2"
2) "1"
3) "0"
4) "100"

LREM key count value ;LREM会删除列表中前count个值为alue的元素,返回值是实际删除的元素个数。

当count > 0时,LREM命令会从列表左边开始删除前 |count|  个值为value的元素

    count < 0时,LREM命令会从列表右边开始删除前 |count|  个值为value的元素

    count = 0时,LREM命令会从从列表中删除所有值为value的元素

6.获得/设置指定索引的元素值

LINDEX  key index  ;返回指定索引的元素,索引从0开始;如果index 为负值,则从右边开始,最右边元素的索引为-1.

LSET key index value ; 将索引为Index的元素赋值为value ;如果Index超过当前的range,则报错为(error) ERR index out of range。

redis 127.0.0.1:6379> LINDEX numbers 3
"100"
redis 127.0.0.1:6379> LINDEX numbers -1
"100"
redis 127.0.0.1:6379> LINDEX numbers -5
(nil)
      

7.只保留列表指定片段

LTRIM key start end

LTRIM命令删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。

redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
redis 127.0.0.1:6379> LTRIM numbers 1 2
OK
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
  

LTRIM和LPUSH一起用来限制列表中元素的数量,比如记录日志时希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:

LPUSH logs $newLog

LTRIM logs 0 99

8.向列表中插入元素

LINSERT key BEFORE|AFTER pivot value

LINSERT 命令首先在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面,如果未找到该值,则返回-1.

redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
redis 127.0.0.1:6379> LINSERT numbers after 0 1024
(integer) 3
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
3) "1024"
redis 127.0.0.1:6379> 
redis 127.0.0.1:6379> LINSERT numbers after 99 1024
(integer) -1

9.将元素从一个列表转到另一个列表

RPOPLPUSH source destnation

RPOPLPUSH功能:先执行RPOP命令,在执行LPUSH命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destnation列表类型键的左边,并返回这个元素的值,整个过程是原子的。

当把列表当作为队列使用时,RPOPLPUSH命令可以直观的子多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断的将队尾的元素移到队首。这个特性可以实时监控网站:使用一个队列存储需要监控的网站,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。

RPOPLPUSH好处在于:程序执行过程中,可以不断地向网址列表中加入新网址,允许多个客户端同时处理队列。