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还支持“发布/订阅”的消息模式,可以基于此构建聊天室① 等系统。
系统环境:
[[email protected] ~]# 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 [[email protected] ~]# 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 &
查看进程:
[[email protected] ~]# 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:
[[email protected] ~]# 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"
命令
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>