1、redis是什么
redis是开源的,使用C语言编写的,支持网络交互的,可基于内存也可持久化的key-value的数据库,官网地址:redis.io,作者:Salvatore Sanfilippo
2、redis安装
从官网下载最新版本redis-X.Y.Z.tag.gz后解压,然后进入redis-X.Y.Z文件夹直接mark即可,安装非常简单。mark成功后会再src文件夹地下产生一些二进制可执行文件,包括redis-server、redis-cli等等
$ find . -type f -executable
./redis-benchmark //用于进行redis性能测试的工具
./redis-check-dump //用于修复出问题的dump.rdb文件
./redis-cli //redis的客户端
./redis-server //redis的服务端
./redis-check-aof //用于修复出问题的AOF文件
./redis-sentinel //用于集群管理
3、redis启动
启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件
./redis-server ../redis.conf
默认情况下,redis-server会以非daemon的方式来运行,且默认的端口号为6379
4、使用redis客户端
这样来启动redis客户端
$ ./redis-cl
用set命令来设置key-value
127.0.0.1:6379> set name "roc"
ok
用get命令来获取值
127.0.0.1:6379> get name
"roc"
通过客户端来关闭redis服务端
127.0.0.1:6379> shutdown
127.0.0.1:6379>
当然也可以使用可视化工具来连接redis服务端:RedisDesktopManager,此工具安装非常简单
5、redis数据结构-简介
redis是一种高级的key:value的存储系统,其中支持value的数据类型游五种
1、字符串(strings)
2、字符串列表(lists)
3、字符串集合(sets)
4、有序字符串集合(sorted sets)
5、哈希(hashes)
而关于key,有几个要点大家要注意:
1、key不要太长,尽量不要超过1024个字节,这不仅消耗内存,而且也降低查找的效率
2、key也不要太短,太短的话会使可读性降低
3、在一个项目中,key最好使用同一的命名模式。
6、redis数据结构-strings
如果说只是用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了,着说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型
set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型
字符串类型的使用就是如此的简单,因为二进制是安全的,所以你完全可以把一个图片内存的文件作为字符串来存错
另外,我们还可以通过自负床进行数值操作
127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"
在遇到数值操作时,redis会将字符串类型转程数值
由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的incr,incrby,decr,decrby等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取mynum的值(2),然后进行对其同时加1的操作,那么,最后mynum的值一定时5.不少网站都利用redis的这一特性来实现业务上的统计需求。
7、redis数据结构-lists
redis的另一个重要的数据结构叫做lists,列表
首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万元素的lists来说,在头尾插入一个新的元素,其时间复杂度是常数级别的,比如用lpush在10个元素的lists头部插入新元素,和在上千万元素的lists的头部插入新元素的速度应该是相同的,这是它的一个优点,但是同时也伴随着它的一个弊端,那就是链表行的lists元素定位会比较慢,而数组型的lists元素定位就会快很多。
lists常用大的操作包括lpush,rpush,lrange等
//新建一个list叫做mylist,并在列表头部插入元素"1"
127.0.0.1:6379> lpush mylist "1"
//返回当前mylist中的元素个数
(integer) 1
//在mylist右侧插入元素"2"
127.0.0.1:6379> rpush mylist "2"
(integer) 2
//在mylist左侧插入元素"0"
127.0.0.1:6379> lpush mylist "0"
(integer) 3
//列出mylist中从编号0到编号1的元素
127.0.0.1:6379> lrange mylist 0 1
1) "0"
2) "1"
//列出mylist中从编号0到倒数第一个元素
127.0.0.1:6379> lrange mylist 0 -1
1) "0"
2) "1"
3) "2"
lists的应用相当广泛,随便举几个例子:
1、我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。 2、利用LRANGE还可以很方便的实现分页的功能。 3、在博客系统中,每片博文的评论也可以存入一个单独的list中。
8、redis数据结构 – 集合
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。
//向集合myset中加入一个新元素"one"
127.0.0.1:6379> sadd myset "one"
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
//列出集合myset中的所有元素
127.0.0.1:6379> smembers myset
1) "one"
2) "two"
//判断元素1是否在集合myset中,返回1表示存在
127.0.0.1:6379> sismember myset "one"
(integer) 1
//判断元素3是否在集合myset中,返回0表示不存在
127.0.0.1:6379> sismember myset "three"
(integer) 0
//新建一个新的集合yourset
127.0.0.1:6379> sadd yourset "1"
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
//对两个集合求并集
127.0.0.1:6379> sunion myset yourset
1) "1"
2) "one"
3) "2"
4) "two"
对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
9、redis数据结构 – 有序集合
redis不但提供了无序集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。
很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等
老规矩,我们来看几个生动的例子:
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1:
127.0.0.1:6379> zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一个元素360.com,赋予它的序号是3
127.0.0.1:6379> zadd myzset 3 360.com
(integer) 1
//向myzset中新增一个元素google.com,赋予它的序号是2
127.0.0.1:6379> zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
127.0.0.1:6379> zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
127.0.0.1:6379> zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"
10、redis数据结构 – 哈希
最后要给大家介绍的是hashes,即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
/建立哈希,并赋值
127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"
//更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "antirez"
3) "password"
4) "12345"
5) "age"
6) "34"
\