redis是单进程的,它通过对linux的epoll函数包装来做到的。
redis默认一共16个库,我们再次打开redis的配置文件查看。
从配置文件的这个属性可以看出database 默认是16个库。从属性上面的一行注释可以看出这个库是从0开始的,也就是第一个库是0,最后一个库是15,一共16个库。我么可以用select命令加角标实现切库的过程。
上图首先我们在0号库存储了一个键为k1 值为mzk的 k v键值对,然后我们可以获取k1的值,然后我们切到6号库,再次获取k1,返回null,证明6号库没有这个键值对。
然后我们在切回0号库,再次获取k1,看到我们获取了mzk。
我们用dbsize命令,可以查看redis库中有多少个键值对
如果想查看全部的键值对,用keys * 命令。
可以查到所有的键。但是不要用keys * 因为这会带来服务器的压力。
清空数据库命令,清空有两个,一个是flashall,一个flushdb,这两个是不一样的,flashall是清空16个库的所有数据,flushdb是清空当前库的数据。
可以看上图,我们清空了当前的数据库,然后查看了一下当前库大小,是0
上图中首先在0号库存入了两个键值对,然后在1号库创建了三个键值对,然后执行了flushall命令,我们查看0号库,一个数据都没有,1号库也没有数据了,这就是flushall与flushdb的区别,all是清空所有数据库数据,db是清空当前数据库的数据。另外redis的索引从0开始。
redis的五大数据类型
String (字符串类型)
Hash (哈希,类似java的Map)
List (列表类型)
Set (集合)
Zset (sorted set: 有序集合)
我们首先了解spring类型。
string是redis的基本类型,可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M
Hash(哈希)
redus hash 是一个键值对集合
redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似java里的Map<String,Object>
List(列表)
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。他的底层是链表。
Set(集合)
redis的set是string类型的无序集合。它是通过HashTable实现的。
zset(有序集合)
redis zset和set一样也是string类型的元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却不可重复。
上图中我们插入了三个键值对,然后用exists命令判断key是否存在,我们判断k1,是存在的,判断k11是不存在的。
剪切key到其他库的操作。
看上图,首先我们先查看0号库的所有key,然后我们move命令将k3剪切到2 号库,再次查询0号库,发现少了k3,然后去2号库查询,出现了k3。
另外我们有一种需求,是这样的,加入在一个公司要对用户搞某些活动,既然是活动,那么他的并发量是很高的,这就需要用redis在活动期间对热点关键字进行用户访问的支撑,但是活动是一定有一个期限的,所以在redis中,有为k定义存活时间的命令,我们给热点关键词设置活动结束时间,当活动结束后,这些关键词就被自动删除了。exprie key秒钟:为给定的key 设置过期时间,ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期。
我们查了一下k2,它是-1,表示永远不过期。
那么我们加一个带有过期时间的键。
这样我们就给k3设置了过期时间,当我们查看他还有多少秒,显示还有15秒过期。
当我们再次查看它已经被删除了。查看下图,k3已经不存在了。
上图中我们为已存在的key设置值,那么它会覆盖,并不会报错冲突,再次获取value我们是可以获取到的。
type命令,查看当前的数据类型是什么
可以看到我们当前查询k2的数据类型为string,字符串类型。
我们获取k2的值,返回meng,然后append k2 zhaokun 表示我们在k2的值后面追加zhaokun字符串,再次获取,可以看到追加成功
strlen命令可以获取当前指定key对应值的长度(前提那个值是string类型的)。
上图中incr命令指定一个key,它对应的值必须是数值类型的,当我们运行一次,他就会加一,这种方式可以用于监控用户的点击次数。
可以看到decr命令与incr相反,每运行一次减一。
incrby命令首先指定一个key,是数值类型,在后面输入要加的数,就可以获得结果,上图每次加2,结果也是没问题的。
上图的decrby,和insrby相反,每次运行减去指定的数值
我们试着给k4加值,由于k4的值不是数值类型,所以不能做运算操作。
我们可以用getrange命令截取一个字符串指定范围的内容。
我么可以用setrange命令给字符串指定的范围修改值。
我们用setex命令设置键值对时,它可以设置存活时间,单位是秒,到了规定的时间,直接删除。
setnx命令与set有一个巨大的区别,在于set会覆盖redis中原有的值,而setnx就不会覆盖原有的值。
mset与mget命令是批量set和get的语法,上图中我们用set做批量设置就报错,语法错误。
我们可以看到msetnx插入k5 k6是不行的,因为k5在redis已经存在了,不可以插入,它只能批量插入redis中不存在的key。
我们批量设置了k8 和k9,看到都添加redis成功。
redis list
上图中我们插入了一个list数组,然后用lrange 查询list01的所有数据没看结果的显示是从5开始到1.
我们用rpush添加一个list02,然后遍历全部内容,它是从一开始,到5,这就是lpush与rpush的区别。
上图中是出栈命令,可以这样理解,list01是lpush list02 是rpush,当lpop list01表示第一个是5,所以5就出栈了,lpop list2 表示第一个是1,所以1就出栈了,rpop从底部出栈,所以list01是1 list02是5
我们用lindex 指定list 然后输入下标可以获得下标对应的值,类似于indexof。
获取指定list的大小。
上图中lrem list03 2 3 表示 我们要删除名称为list03列表的2个 3,也就是数字3删除两个。查看结果看得出3就剩下一个了。
上图中我们给list1赋值0到9,然后用ltrim命令截取了list1的第3到第5个元素,然后重新赋值给list1,最后查看list1的结果看得出来我们截取的范围重新复制到list1中。
上图可以看出rpoplpush 列表1 列表2 意思就是我们将列表一的最后一个值追加到列表2的开头。
从上图中可以看得出来lset命令就表示,我指定列表名称,指定下标,替换对应下标的值。
从上图中可以看的出来,linsert list04 before x java表示list04这个列表在x的前面插入一个java
从上图中可以看出用after就是在这个列表中指定的字符串这里指定的是x的后面加上python。
redis set集合
上图中是向set集合中添加数据,查看结果可以看出set集合中存入了三个值,因为set集合是不允许有重复值的。
可以看到确实是没有重复值。
从上面命令sismember命令可以可以看出,set01集合中有1 但是没有x
scard,查询set集合的元素个数。
上图中我们创建了一个set集合名字叫set02,然后用srandmember命令可以从刚才的set集合中随机抽取三个数字,就像上面那样从set02中随机抽取三个数,并显示。
从上图可以看出set01集合是存在三个数字的,然后我们又在set01重新添加值,可以看到,只添加了5个,因为 1 2 3 已经存在了。
spop 指定set集合的名称,可以看出这个命令是将set集合的元素随机出栈,注意这不是顺序的,而是随机的。
上面的图首先我们在set01中添加了五个数字,然后在set02中添加了三个字母,然后用smove命令将set01集合的数字2,移动到set02集合中,查看set02集合,多出来数字2,这就是smove的作用。
上图sdiff命令就是将两个set集合进行比较,这里是指set01比较set02,不一样的地方是4和5,所以打印它们。如果打印a和b的话,就应该是命令sdiff set02 set01。
上图sunion是两个set集合的并集。
上图sinter是两个集合的交集。
redis hash
上图就是hash集合的基本写法,用hset命令,其中key是user ,value是name mengzhaokun。还有批量的写法。
上图就是hash集合的批量写法。
上图中还可以用hgetall方法指定一个hash集合的名字,可以获取这个key的所有属性与值。
上图中我们用hdel命令可以删除customer 里的name属性。再次查看可以看出name属性已经不存在了。
hlen命令查询hash集合还存在几个属性,这里查询结果还有三个。
hexists命令查询这个属性是否存在,存在返回1,不存在返回0.
hkeys命令查询hash集合的所有属性,hvals命令查询所有属性对应的值。
我们用hincrby命令指定属性并且指定增长的值后,属性的值会增加。
上图hincrbyfloat命令是专门加小数的。
上图中hsetnx命令如果hash集合存在这个属性,那么插入失败,如果没有这个属性就可以插入。
redis 之 zset
zadd 向zset集合存入数据,zrange 可以取出所有的值,
后面加一个withscores可以可以获取属性和值。
我们查询了60级到90级的,可以看到v5没有显示出来。
在90前加一个小括号,表示小于90的。
表示大于60 小于90的。
我们还可以用limit命令控制显示结果。
zrem可以删除一个等级,再次查询发现v5和分数都没有了。
统计zset元素的个数。
统计60分到80分的有多少个元素。
zrank命令获取属性对应的下标。
获取v4对应的分数。
这个命令是刚才zrank命令的倒叙,zrank是正着显示下标,zrevrank是倒着显示下标,它是最后一个所以它是0.
zravrange是倒着显示zset集合的元素,与zrange命令相反。
zrevrangebyscore命令与zrangebyscore相反,后者是给定范围正向查找,前者是给定范围,反向查找,但是正向查找范围只能由小到大,反向查找范围只能由大到小。