我们在学习一个新事物之前,通常会问三个问题:它是什么东西?它是如何使用的呢?它的优势是什么呢?
我觉得这是一种好的学习习惯,带着问题去学习会具有导向性,目标性。其实以上三个问题说的具体一点就是,它的定义是是什么,或者问的更深一点,它的实现原理是什么;它的基本使用方法是什么,包括使用环境,语法等等;它适用于哪些应用场景,即优势所在。
1.什么是redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
另外关于redis的实现原理内容比较复杂而且很多,在此处不做介绍。留下一个传送门,以后有兴趣可以看看:
http://redisbook.com/
2.如何使用redis
使用redis之前,我们必须安装redis。
在linux下的安装步骤如下:
首先切换到root用户下,然后执行以下命令即可安装成功。
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make
依旧是在root用户下,执行以下命令启动redis服务。
cd src
./redis-server 或者 ./redis-server redis.conf
建议使用后台模式启动 ./redis-server redis.conf &
查看服务是否启动成功 ps -ef | grep redis
确定服务启动后,使用客户端程序打开交互式命令行。./redis-cli
到此处,redis的环境已经全部搭建好了。
下面开始redis的使用:
首先关于redis支持的多种数据类型。
Redis strings
Redis Lists
Redis Hashes
Redis set
Redis (sorted set)有序集合
字符串类型。
SET和GET命令来创建和检索strings。注意,set命令将取代现有的任何已经存在的key。SET命令还有一个提供附加参数的选项,我们能够让SET命令只有在没有相同key的情况下成功,反之亦然,可以让SET命令在有相同key值得情况下成功。
即使string是Redis的基本类型,也可以对其进行一些有趣的操作,例如加法器。
INCR命令让the value 成为一个整数,运行一次INCR便+1。INCRBY命令便是一个加法运算。类似的命令如减法运算为: DECR and DECRBY。
Redis可以运用MSET and MGET 命令完成一次性的完成多个key-value的对应关系,使用MGET命令,Redis返回一个value数组。
链表。
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素到头部, 而 RPUSH插入一个新元素到尾部.当一个这两个操作在一个空的Key上被执行的时候一个新的列表被创建。相似的,如果一个列表操作清空一个列表那么对应的key将被从key空间删除。这是非常方便的语义,因为他们被调用使用一个空列表完全就像他们被调用时使用一个不存在的键值(可以)做为参数。
注意:LRANGE 利用了两个检索值,0表示list的开头第一个,-1表示list的倒数第一个,即最后一个。-2则便是list的倒数第二个,以此类推。
这些命令都是可变的命令,也就是说你可以一次加入多个元素放入list。
在Redis的命令操作中,还有一类重要的操作:POP,取出list元素。和PUSH操作类似,POP命令可以选择不同的方向取出元素.POP命令返回值为取出的元素。
哈希表。
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
Redis Hashes是字符串字段和字符串值之间的映射,因此他们是展现对象的完美数据类型。 (例如:一个有名,姓,年龄等等属性的用户):一个带有一些字段的hash仅仅需要一块很小的空间存储,因此你可以存储数以百万计的对象在一个小的Redis实例中。 哈希主要用来表现对象,他们有能力存储很多对象,因此你可以将哈希用于许多其他的任务。
HMSET命令设置一个多域的hash表,HGET命令获取指定的单域,HGETALL命令获取指定key的所有信息。HMGET类似于HGET,只是返回一个value数组。
无序集合。
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
SADD命令产生一个无序集合,返回集合的元素个数。SMEMBERS用于查看集合。
SISMEMBER用于查看集合是否存在,匹配项包括集合名和元素个数。匹配成功返回1,匹配失败返回0.
有序集合。
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
其他常用命令:
EXISTS key 判断一个key是否存在;存在返回 1;否则返回0;
DEL key 删除某个key,或是一系列key;DEL key1 key2 key3 key4。成功返回1,失败返回0(key值不存在);
TYPE key:返回某个key元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash),key不存在返回空;
KEYS key—pattern :返回匹配的key列表 (KEYS foo*:查找foo开头的keys);
RANDOMKEY : 随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串;
RENAME oldname newname:改key的名字,新键如果存在将被覆盖;
RENAMENX oldname newname:更改key的名字,如果newname存在,则更新失败;
DBSIZE :返回当前数据库的key的总数
3.redis的优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
参考:
http://www.runoob.com/redis/redis-install.html
https://www.shiyanlou.com/courses/106