redis安装与学习

redis介绍

 redis存储结构类型:字符串类型、散列型、列表型、集合型、有序集合型。

redis内存存储和持久化:redis数据库中的数据都存储在内存中,内存的读写速度快于硬盘,因此redis相对于那些将数据存储在硬盘上数据库有明显的优势。redis可以在一秒钟内读写十万个键值。redis提供持久化的支持,将内存中的数据异步写入到硬盘中,使数据不会丢失,同时不影响业务继续提供服务。

redis丰富的功能:Redis虽然是作为数据库开发的,但由于其提供了丰富的功能,越来越多的人将其用作缓存、队列系统等。Redis可谓是名副其实的多面手。Redis可以为每个键设置生存时间(Time To Live,TTL),生存时间到期后键会自动被删除。这一功能配合出色的性能让Redis可以作为缓存系统来使用,而且由于Redis支持持久化和丰富的数据类型,使其成为了另一个非常流行的缓存系统Memcached的有力竞争者。讨论 关于Redis和Memcached优劣的讨论一直是一个热门的话题。在性能上Redis是单线程模型,而Memcached支持多线程,所以在多核服务器上后者的性能更高一些。然而,前面已经介绍过,Redis的性能已经足够优异,在绝大部分场合下其性能都不会成为瓶颈。所以在使用时更应该关心的是二者在功能上的区别,如果需要用到高级的数据类型或是持久化等功能,Redis将会是Memcached很好的替代品。作为缓存系统,Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定的规则自动淘汰不需要的键。除此之外,Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易地实现一个高性能的优先级队列。同时在更高层面上,Redis还支持“发布/订阅”的消息模式,可以基于此构建聊天室① 等系统。

系统环境:

[root@DBSERVER ~]# uname -a
Linux DBSERVER 2.6.18-274.el5 #1 SMP Fri Jul 8 17:36:59 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@DBSERVER ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga)

安装redis:

 tar -xf redis-3.0.0.tar.gz 
 cd redis-3.0.0
 make
 make install

编辑redis配置文件redis.conf,添加如下内容:

cp redis.conf /etc/redis.conf

logfile "/var/log/redis.log"
port 6380  #默认redis的端口为6379
pidfile /var/run/redis.pid

启动redis:

redis-server /etc/redis.conf &

查看进程:

[root@ORACLE ~]# ps -ef|grep redis
root      6635  3519  0 11:42 pts/0    00:00:00 redis-server *:6380         
root      6641  6537  0 11:43 pts/1    00:00:00 redis-cli -p 6380
root      6677  3519  0 12:23 pts/0    00:00:00 grep redis

使用redis-cli客户端连接redis:

[root@ORACLE ~]# redis-cli -p 6380
127.0.0.1:6380> echo hi
"hi"
127.0.0.1:6380> set foo 1
OK
127.0.0.1:6380> 

关闭redis:

redis-cli -p 6380 shutdown

 

回复类型

1.状态回复

状态回复(status reply)是最简单的一种回复,比如向Redis发送SET命令设置某个键的值时,Redis会回复状态OK表示设置成功。另外之前演示的对PING命令的回复PONG也是状态回复。状态回复直接显示状态信息,例如:

redis>PING

PONG

2.错误回复

当出现命令不存在或命令格式有错误等情况时Redis会返回错误回复(error reply)。错误回复以(error)开头,并在后面跟上错误信息。如执行一个不存在的命令:

redis>ERRORCOMMEND

(error) ERR unknown command 'ERRORCOMMEND'

3.整数回复

Redis虽然没有整数类型,但是却提供了一些用于整数操作的命令,如递增键值的INCR命令会以整数形式返回递增后的键值。除此之外,一些其他命令也会返回整数,如可以获取当前数据库中键的数量的DBSIZE命令等。整数回复(integer reply)以(integer)开头,并在后面跟上整数数据:

redis>INCR foo

(integer) 1

4.字符串回复字符串回复(bulk reply)是最常见的一种回复类型,当请求一个字符串类型键的键值或一个其他类型键中的某个元素时就会得到一个字符串回复。字符串回复以双引号包裹:

redis>GET foo

"1"

特殊情况是当请求的键值不存在时会得到一个空结果,显示为(nil)。如:

redis>GET noexists
(nil)

5.多行字符串回复

多行字符串回复(multi-bulk reply)同样很常见,如当请求一个非字符串类型键的元素列表时就会收到多行字符串回复。多行字符串回复中的每行字符串都以一个序号开头,如:

redis> KEYS *
1) "bar"
2) "foo"

 

命令

字符类型

一个字符类型键允许存储的数据的最大容量是512MB

1、赋值与取值

set key value

get key

 

127.0.0.1:6380> set foo 1
OK
127.0.0.1:6380> get foo
"1"
127.0.0.1:6380> get name
(nil)
127.0.0.1:6380> 

 

当键不存在时,返回一个空值。

2、递增数字

INCR key

127.0.0.1:6380> incr num
(integer) 1
127.0.0.1:6380> incr num
(integer) 2
127.0.0.1:6380> get num
"2"
127.0.0.1:6380> set foo cheeron
OK
127.0.0.1:6380> incr foo
(error) ERR value is not an integer or out of range

当操作的键不存在时会默认键值为0,所以第一次递增为1,当键值不是整数时,redis会提示错误。

3、增加指定的整数

INCRBY key increment

减少指定的整数

DECR key 

DECRBY key decrement

127.0.0.1:6380> get num
"2"
127.0.0.1:6380> incrby num 3
(integer) 5
127.0.0.1:6380> get num
"5"
127.0.0.1:6380> decr num
(integer) 4
127.0.0.1:6380> decrby num 2 
(integer) 2
127.0.0.1:6380> get num
"2"
127.0.0.1:6380> 

4、增加指定浮点数

INCRBYFLOAT key increment

127.0.0.1:6380> get num
"2"
127.0.0.1:6380> incrbyfloat num 2.4
"4.4"
127.0.0.1:6380> get num
"4.4"
127.0.0.1:6380> 

5、向尾部追加值

APPEND key value

获取字符串长度

STRLEN key

127.0.0.1:6380> set key hello
OK
127.0.0.1:6380> append key world
(integer) 10
127.0.0.1:6380> get key
"helloworld"
127.0.0.1:6380> strlen key
(integer) 10
127.0.0.1:6380> set key 我是青铜
OK
127.0.0.1:6380> strlen key
(integer) 12

当键值不存在时,返回长度为0,redis接收到的是UTF-8编码的中文,UTF-8编码的中文的长度是3

6、同时获得/设置多个值

MSET key value key value ...

MGET key1 key2 key3

127.0.0.1:6380> mset num1 1 num2 2 num3 3
OK
127.0.0.1:6380> mget num1 num2 num3
1) "1"
2) "2"
3) "3"
127.0.0.1:6380> 

 散列类型

1、赋值与取值

HSET key field value

HGET key field 

HMSET key field1 value field2 value ...

HMGET key field1 field2...

HGETALL key

 

127.0.0.1:6380> hget car price
"500"
127.0.0.1:6380> hget car
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6380> hmset car price 500 color red date 20150213
OK
127.0.0.1:6380> hmget car price color date
1) "500"
2) "red"
3) "20150213"
127.0.0.1:6380> hgetall car
1) "price"
2) "500"
3) "color"
4) "red"
5) "date"
6) "20150213"

 

HSET命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插入操作时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已经存在)HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它。

 

 

127.0.0.1:6380> hset car price 600
(integer) 0
127.0.0.1:6380> hget car price
"600"
127.0.0.1:6380> set car benz
OK
127.0.0.1:6380> get car
"benz"
127.0.0.1:6380> hget car price
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6380> 

 

SET命令可以覆盖已经存在的键而不论原来键是什么类型

2、判断字段是否存在

HEXISTS key field 

3、当字段不存在时赋值

HSETNX key field value

127.0.0.1:6380> hexists car model
(integer) 0
127.0.0.1:6380> hset car model C200
(integer) 1
127.0.0.1:6380> hexists car model
(integer) 1
127.0.0.1:6380> hexists car color
(integer) 0
127.0.0.1:6380> hgetall car
1) "model"
2) "C200"
127.0.0.1:6380> hsetnx car color red
(integer) 1
127.0.0.1:6380> hget car color
"red"
127.0.0.1:6380> 

4、增加数字

HINCRBY key field increment

删除字段

HDEL key field1 field2...

127.0.0.1:6380> hincrby car num 100
(integer) 100
127.0.0.1:6380> hget car num
"100"
127.0.0.1:6380> hgetall car
1) "model"
2) "C200"
3) "color"
4) "red"
5) "num"
6) "100"
127.0.0.1:6380> hdel car model
(integer) 1
127.0.0.1:6380> hgetall car
1) "color"
2) "red"
3) "num"
4) "100"
127.0.0.1:6380> hdel car color num
(integer) 2
127.0.0.1:6380> hgetall car
(empty list or set)

只获取字段名或字段值

HKEYS key

HVALS key

127.0.0.1:6380> HGETALL car
1) "price"
2) "100"
3) "color"
4) "red"
5) "model"
6) "C200"
127.0.0.1:6380> hkeys car
1) "price"
2) "color"
3) "model"
127.0.0.1:6380> hvals car
1) "100"
2) "red"
3) "C200"

获取字段数量

HLEN key

127.0.0.1:6380> hgetall car
1) "price"
2) "100"
3) "color"
4) "red"
5) "model"
6) "C200"
127.0.0.1:6380> hlen car
(integer) 3

 列表

LPUSH key value1 value2 ...   从左边插入

RPUSH key value1 value2 ...  从右边插入

LPOP key  从左边弹出

RPOP key  从右边弹出

LLEN key   获取key的长度

LRANGE key start stop   获取某个范围的值

LREM key count value  删除某个值

(1)如果start的索引位置比stop的索引位置靠后,则会返回空列表。
(2)如果stop大于实际的索引范围,则会返回到列表最右边的元素

 ●当count>0时LREM命令会从列表左边开始删除前count个值为value的元素;
 ●当count<0时LREM 命令会从列表右边开始删除前count个值为value的元素;
 ●当count=0是LREM命令会删除所有值为value的元素。

127.0.0.1:6380> lpush aa 1 2 3 0
(integer) 4
127.0.0.1:6380> llen aa
(integer) 4
127.0.0.1:6380> lrange aa 0 -1
1) "0"
2) "3"
3) "2"
4) "1"
127.0.0.1:6380> rpush -1 -2 -3
(integer) 2
127.0.0.1:6380> rpush aa -1 -2 -3
(integer) 7
127.0.0.1:6380> lrange aa 0 -1
1) "0"
2) "3"
3) "2"
4) "1"
5) "-1"
6) "-2"
7) "-3"
127.0.0.1:6380> lpop aa 
"0"
127.0.0.1:6380> lrange aa 0 -1
1) "3"
2) "2"
3) "1"
4) "-1"
5) "-2"
6) "-3"
127.0.0.1:6380> rpop aa
"-3"
127.0.0.1:6380> lrange aa 0 -1
1) "3"
2) "2"
3) "1"
4) "-1"
5) "-2"
127.0.0.1:6380> lrange aa 2 4
1) "1"
2) "-1"
3) "-2"
127.0.0.1:6380> lrange aa 0 -1
1) "3"
2) "2"
3) "1"
4) "-1"
5) "-2"
127.0.0.1:6380> lrem aa 1 -1
(integer) 1
127.0.0.1:6380> lrange aa 0 -1
1) "3"
2) "2"
3) "1"
4) "-2"
127.0.0.1:6380> 

 

posted @ 2015-04-13 15:11  cheerong  阅读(180)  评论(0编辑  收藏  举报