1.什么是Redis?我们来看看Redis官网给出的介绍:Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。它支持字符串,哈希等数据结构、列表、集合、带有范围查询的排序集合、位图、hyperloglogs、带有半径查询和流的地理空间索引。Redis具有内置复制、Lua脚本、LRU逐出级别和磁盘持久性事务,并通过RedisSentinel和RedisCluster自动分区提供高可用性。简而言之,Redis是一个用ANSIC语言编写的开源程序,遵守BSD协议,支持网络,可以基于内存,可以持久化日志类型,Key-Value数据库,并提供多种数据类型,功能相当强大。2、Redis之父Redis之父是来自意大利西西里岛的程序员SalvatoreSanfilippo,大家更习惯称呼他为Antirez。如果你对他感兴趣,可以访问他的博客或者关注他的github。3、Redis有什么优势速度快:Redis使用内存来存储数据集,支持Pipelining命令,可以一次发送多条命令。持久化:内存中的数据可以保存到磁盘中,重启时可以重新加载使用。原子性:所有操作都是原子的,支持事务。丰富的数据结构:支持字符串、列表、哈希、集合和有序集合,满足大部分使用需求。多语言支持:Redis支持C、C++、C#、Go、Java、JavaScript、PHP等多种语言。各种特性:Redis还支持发布/订阅、通知、密钥过期等特性。4、Redis能做什么因为Redis交换数据的速度很快,所以在服务器中经常使用它来存储一些需要经常取回的数据。与直接读磁盘获取数据相比,使用Redis可以节省大量时间,提高效率。.例如:某视频网站每天有100万人访问首页推荐视频栏目。如果全部从数据库查询中读取,那么每天至少会多出100万次数据库查询请求。如果使用Redis,将频繁检索的数据存储在内存中,每次节省0.1秒,100万次节省10万秒,大大提高了速度和开销。总之,Redis的应用场景非常广泛,价值极高,现在就开始学习基础知识吧。5、安装Redis工欲善其事必先利其器。学习Redis的第一步肯定是安装Redis。由于我的环境是Windows系统,所以我只演示Windows下Redis的安装。如果不想安装Redis,想体验一下,可以去官网提供的在线测试网站,里面也有简单的介绍和教程。Windows下安装Redis下载地址:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100这里我们下载Redis-x64-3.2.100.zip压缩包文件(如果有更新的版本,您可以下载最近更新的稳定版)。download下载后解压到你自己的文件夹中。比如我解压到D:\redis。unzip打开一个cmd窗口,使用cd命令将目录切换到解压后的文件夹路径(比如我把目录切换到D:\redis),然后运行命令:redis-server.exeredis.windows.conf。输入后会显示如下界面:redis-server这样我们就开通了一个redis服务器。从图中我们可以看到一些信息,比如端口号是6379,如果我们要使用redis服务器,需要再打开一个cmd窗口,不要关闭原来的,否则将无法访问服务器。同样将路径切换到redis目录,然后运行:redis-cli.exe-h127.0.0.1-p6379存储键值对:setfirstkey"helloredis"取出键值对:getfirstkey关闭连接:quitfirst_useandwearedone我在Windows下安装了Redis,第一次体验Redis的key-value存储方式。6、Redis数据结构Redis支持五种数据结构:String(字符串)、Hash(散列)、List(列表)、Set(集合)和SortedSet(有序集合)。下面我们简单介绍一下各个数据结构及其基本命令。StringString是Redis最基本的数据结构,也是任何存储系统必备的数据类型。String类型是二进制安全的。简而言之,您基本上可以将任何内容存储在字符串中。您可以将图像文件或序列化对象的内容存储为字符串。String类型的值最多可以存储512MB,基本可以存储所有内容。>setmykey"helloworld"OK>geymykey"helloworld">getrangemykey610"world">getrangemykey020"helloworld">getrangemykey0-1"helloworld"当大于字符串长度时,返回完整的字符串;当end为-1时,end为字符串的最后一个字符。>getsetdatabase"mysql"(nil)>getdatabase"mysql">getsetdatabase"redis""mysql">getdatabase"redis"提示:未设置key时,返回(nil)。>strlenmykey(integer)11>appendmykey",helloredis"24>getmykey"helloworld,helloredis">setincr_num10OK>getincr_num"10">incrincr_num(integer)11>incrbyincr_num4(intrger)15>incrbyfloatincr_num0.515.5提示:整数值将是显示为整数,当变成浮点型时,不会提示为float>setdecr_num10OK>getdecr_num"10">decrdecr_num(integer)9>decrbydecr_num4(integer)5提示:redis没有命令减少给定一个数字值的浮点值,如果我们想将decr_num减少2.5,我们可以使用incrbyfloat命令执行incrbyfloatdecr_num-2.5。>incrbyfloatdecr_num-2.52.5decrbykeydecrement:整数值按给定的整数值递减(递减)decrkey:整数值-1incrbyfloatkeyincrement:数字值按给定的浮点值递增(递增)incrbykeyincrement:整数值递增固定整型值(自增)ncrkey:整型值+1appendkeyvalue:如果已经存在且为字符串,则将指定值添加到原值的末尾,运算后的字符串长度bereturnedstrlenkey:返回的key存储的字符串值的长度getsetkeyvalue:设置指定key的新值并返回旧值getrangekeystartend:返回key中字符串的子串指定键的值设置键值:设置指定键2、HashHash存储字段与值的映射关系,适用于用户存储对象。例如,要存储用户的姓名、年龄、地址等,可以使用Hash。每个Hash可以存储232>-1个字段值对(4294967295,超过40亿)。>hsetmyhashname"test"(integer)1>hgetmyhashname"NPC">hsetmyhashname"NPC"(integer)0Tips:使用hset命令新建一个字段并设置值成功,则返回1,如果修改了an的值已存在的字段,返回0。>hmsetmyhashage"20"country"China"OK>hexistsmyhashname(integer)1>hexistsmyhashphone(integer)0提示:如果哈希表key包含field字段返回1,不包含or返回0相应的密钥不存在。>hmgetmyhashnameagephone1)"NPC"2)"20"3)(nil)>hgetallmyhash1)"name"2)"NPC"3)"age"4)"20"5)"country"6)"China">hkeysmyhash1)"name"2)"age"3)"country">hvalsmyhash1)"NPC"2)"20"3)"China">hlenmyhash3>hdelmyhashage(integer)1hdelkeyfield1:删除哈希表key中的一个字段hlenkey:获取哈希表key中的字段个数hvalskey:获取哈希表key中的所有值hkeyskey:获取哈希表key中的所有字段hgetallkey:获取哈希表中所有的字段-值对hashtablekeyhmgetkeyfield1[field2]:获取哈希表中所有给定字段的值hexistskeyfield:检查该字段是否存在于哈希表中同时哈希表的键-值对。hsetkeyfieldvalue:设置哈希表中key中字段的值为valuehgetkeyfield:获取哈希表中key中字段对应的value3.ListRedis的List类型是一个简单的字符串列表,相当于一个链表,我们可以在链表的头部(左)或者尾部(右)添加值。一个列表最多可以存储232>-1个元素(4294967295,超过40亿)。>lpushmylist"a""b"(integer)2>rpushmylist"c""d"(integer)4Tips:执行完lpush和rpush命令后,返回list的长度。>llenmylist(integer)4>lrangemylist0-11)"b"2)"a"3)"c"4)"d">lrangemylist1-21)"a"2)"c"提示:从上面的例子我们是不丑lrange命令中的start和end参数都是索引值,其中0代表第一个元素,-1代表最后一个元素。>lindexmylist0"b">lpopmylist"b">rpopmylist"d">rpushrem"hello""hello""redis""hello"(整数)4>lrangerem0-11)"hello"2)"hello"3)"redis"4)"hello">lremrem-2"hello"(integer)2>lrangerem0-11)"hello"2)"redis"count>0:从左到右查找列表,去掉等于该值的元素,计数的数量。count<0:从右到左查找列表,去掉等于value的元素,个数为count的绝对值。count=0:删除列表中所有等于value的元素。lremkeycountvalue:根据count的值,移除链表中等于参数值的元素lpopkey:移除并获取链表头部的值rpopkey:移除并获取链表尾部的值ofthelistlindexkeyindex:通过索引获取list中的元素lrangekeystartend:获取list指定范围内的值llenkey:获取list的长度lpushkeyvalue1[value2]:插入一个或多个值intotheheadofthelist(leftside)rpushkeyvalue1[value2]:insert在列表的末尾(右侧)插入一个或多个值。4、SetSet(集合)存储字符串类型的值。集合不允许有重复元素,但是集合中的元素没有顺序。集合中最大的成员数是232>-1(4294967295,超过40亿)。>saddmyset1"hello""redis"(integer)2>saddmyset1"hello"(integer)0Tips:向集合添加重复成员时,返回0>scardmyset12>smembersmyset11)"hello"2)"redis">saddmyset2"hello"“世界”(整数)2>sdiffmyset1myset21)“redis”>sdiffmyset2myset11)“世界”>sintermyset1myset21)“你好”>sunionmyset1myset21)“你好”2)“redis”3)“世界”>saddmyset1“NPC”(整数)1>spopmyset1"redis">smembersmyset11)"NPC"2)"hello"spopkey:移除并返回集合中的一个随机元素sunionkey1[key2]:返回所有给定集合的并集sinterkey1[key2]:返回交集ofallgivensetssdiffkey1[key2]:返回所有给定集合的差异集成员5.SortedSet除了无序集(Set),Redis还提供了一个有序集(SortedSet)。有序集不允许重复的成员,每个不同的成员都关联一个double类型的分数。Redis通过将这些分数从小到大对成员进行排序。有序集有时称为ZSet,因为它的命令都以字母Z开头。>zaddmyzset10"one"20"two"30"three"(整数)3>zcardmyzset3>zscoremyzset"one"10.0>zrangemyzset0-11)"one"2)"two"3)"three">zrangemyzset0-1withscores1)"one"2)10.03)"二"4)20.05)"三"6)30.0>zrevrangemyzset0-1withscores1)"三"2)30.03)"二"4)20.05)"一"6)10.0>zrankmyzset"一"0>zrankmyzset"三"2>zrevrankmyzset"一"2>zrevrankmyzset"三"0>zcountmyzset15402>zrangemyzset0-1withscores1)"一"2)10.03)"二"4)20.05)"三"6)30.0>zincrbymyzset40"一"50.0>zrangemyzset0-1withscores1)"two"2)20.03)"three"4)30.05)"one"6)50.0zincrbykeyincrementmember:增加指定成员增量的分数zcountkeyminmax:返回min和max之间的分数会员数量zrankkeymember:返回指定会员的排名,从小到大排序zrevrankkeymember:返回指定会员成员排名,从大到小排序zrangekeystartend[withscores]:返回成员zrevrangekeystartend[withscores]:返回成员zscorekeymember从大到小通过indexstartandend:返回指定成员zcard的分数key:获取有序集的成员个数zaddkeyscore1member1[score2member2]:向有序集中添加一个或多个成员,或者更新已有成员的分数
