redis实操指南,kafka入门到精通文档

 HVALS key

返回指定Key的所有Values名。

返回值:Value的列表。

 HMSET key field value [field value …]

逐对依次设置参数中给出的Field/Value对。如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value。

其实就是同时设置多个键和值的操作。

 HMGET key field [field …]

获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组nil。

是同时获取所有的键对应的值。

返回值:返回和请求Fields关联的一组Values,其返回顺序等同于Fields的请求顺序。

5. set类型常见操作

在Redis中,我们可以将Set类型看作为没有排序的字符串集合。Set可包含的最大元素数量是4294967295。

Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

常见操作

 SADD key member [member …]

如果在插入的过程用,参数中有的成员在Set中已经存在,该成员将被忽略,而其它成员仍将会被正常插入。如果执行该命令之前,该Key并不存在,该命令将会创建一个新的Set,此后再将参数中的成员陆续插入。

返回值:本次操作实际插入的成员数量。

 SCARD key

获取Set中成员的数量。

返回值:返回Set中成员的数量,如果该Key并不存在,返回0。

 SISMEMBER key member

判断参数中指定成员是否已经存在于与Key相关联的Set集合中。

返回值:1表示已经存在,0表示不存在,或该Key本身并不存在。

 SMEMBERS key

获取与该Key关联的Set中所有的成员。

返回值:返回Set中所有的成员。

 SPOP key

随机的移除并返回Set中的某一成员。 由于Set中元素的布局不受外部控制,因此无法像List那样确定哪个元素位于Set的头部或者尾部。

返回值:返回移除的成员,如果该Key并不存在,则返回nil。

 SRANDMEMBER key

和SPOP一样,随机的返回Set中的一个成员,不同的是该命令并不会删除返回的成员。

返回值:返回随机位置的成员,如果Key不存在则返回nil。

 SREM key member [member …]

从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理。

返回值:从Set中实际移除的成员数量,如果没有则返回0。

 SMOVE source destination member

将一个成员从一个set集合中移入到另一个set集合中。

原子性的将参数中的成员从source集合移入到destination集合中。如果该成员在source集合中并不存在,该命令将不会再执行任何操作并返回0,否则,该成员将从source集合移入到destination集合。如果此时该成员已经在destination集合中存在,那么该命令仅是将该成员从source集合中移出。

返回值:1表示正常移动,0表示source中并不包含参数成员。

 SDIFF key [key …]

返回参数中第一个Key所关联的Set和其后所有Keys所关联的Sets中成员的差异。如果Key不存在,则视为空Set。其实就是取差集

返回值:差异结果成员的集合。返回的第一个key所有的set中的数据。

 SDIFFSTORE destination key [key …]

该命令和SDIFF命令在功能上完全相同,两者之间唯一的差别是SDIFF返回差异的结果成员,而该命令将差异成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。其实就是将取出的差集保存到一个集合中。

返回值:返回差异成员的数量。

 SINTER key [key …]

该命令将返回参数中所有Keys关联的Sets中成员的交集。因此如果参数中任何一个Key关联的Set为空,或某一Key不存在,那么该命令的结果将为空集。其实就是取交集。

返回值:交集结果成员的集合。

 SINTERSTORE destination key [key …]

该命令和SINTER命令在功能上完全相同,两者之间唯一的差别是SINTER返回交集的结果成员,而该命令将交集成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。其实就是将取的交集保存到集合中。

返回值:返回交集成员的数量。

 SUNION key [key …]

该命令将返回参数中所有Keys关联的Sets中成员的并集。

返回值:并集结果成员的集合。

 SUNIONSTORE destination key [key …]

该命令和SUNION命令在功能上完全相同,两者之间唯一的差别是SUNION返回并集的结果成员,而该命令将并集成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。其实就是将获取的并集保存到另一个集合中。

返回值:返回并集成员的数量。

6. sortedSet类型常见操作

Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

常见操作

 ZADD key score member [score] [member]

添加参数中指定的所有成员及其分数到指定key的Sorted-Set中,在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中。:

返回值:本次操作实际插入的成员数量。

 ZINCRBY key increment member

该命令将为指定Key中的指定成员增加指定的分数。如果成员不存在,该命令将添加该成员并假设其初始分数为0,此后再将其分数加上increment。如果Key不存,该命令将创建该Key及其关联的Sorted-Sets,并包含参数指定的成员,其分数为increment参数。

返回值:以字符串形式表示的新分数。

 ZCARD key

获取与该Key相关联的Sorted-Sets中包含的成员总数量。

返回值:返回Sorted-Sets中的成员数量,如果该Key不存在,返回0。

 ZCOUNT key min max

该命令用于获取分数(score)在min和max之间的成员数量。缺省情况下,min和max表示的范围是闭区间范围,即min <= score <= max内的成员将被返回。然而我们可以通过在min和max的前面添加"("字符来表示开区间,如(min max表示min < score <= max,而(min (max表示min < score < max。

返回值:分数指定范围内成员的数量。

 ZRANGE key start stop [WITHSCORES]

该命令返回排名在参数start和stop指定范围内的成员,这里start和stop参数都是0-based,即0表示第一个成员,-1表示最后一个成员。如果start大于该Sorted-Set中的最大索引值,或start > stop,此时一个空集合将被返回。如果stop大于最大索引值,该命令将返回从start到集合的最后一个成员。如果命令中带有可选参数WITHSCORES选项,该命令在返回的结果中将包含每个成员的分数值,如value1,score1,value2,score2…。

返回值:返回索引在start和stop之间的成员列表。

 ZREVRANGE key start stop [WITHSCORES]

该命令的功能和ZRANGE基本相同,唯一的差别在于顺序相反。

返回值:返回指定的成员列表。

 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

该命令将返回分数在min和max范围内的成员,即满足表达式min <= score <= max的成员,其中返回的成员是按照其分数从低到高的顺序返回,如果成员具有相同的分数,则按成员的字典顺序返回。可选参数LIMIT用于限制返回成员的数量范围。可选参数offset表示从符合条件的第offset个成员开始返回,同时返回count个成员。

返回值:返回分数在指定范围内的成员列表。

 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

该命令除了排序方式是基于从高到低的分数排序之外,其它功能和参数含义均与ZRANGEBYSCORE相同。

返回值:返回分数在指定范围内的成员列表。

 ZRANK key member

该命令将返回参数中指定成员的位置值(按分数由低到高的顺序),其中0表示第一个成员,它是Sorted-Set中分数最低的成员。

返回值:如果该成员存在,则返回它的位置索引值。否则返回nil。

 ZREVRANK key member

该命令的功能和ZRANK基本相同,唯一的差别在于顺序相反

返回值:如果该成员存在,则返回它的位置索引值。否则返回nil。

 ZSCORE key member

获取指定成员的分数。

返回值:如果该成员存在,以字符串的形式返回其分数,否则返回nil。

 ZREM key member [member …]

该命令将移除参数中指定的成员,其中不存在的成员将被忽略。如果与该Key关联的Value不是Sorted-Set,相应的错误信息将被返回。

返回值:实际被删除的成员数量。

 ZREMRANGEBYRANK key start stop

删除索引位置位于start和stop之间的成员,start和stop都是0-based,即0表示分数最低的成员,-1表示最后一个成员,即分数最高的成员。

返回值:被删除的成员数量。

 ZREMRANGEBYSCORE key min max

删除分数在min和max之间的所有成员,即满足表达式min <= score <= max的所有成员。对于min和max参数,可以采用开区间的方式表示,具体规则参照ZCOUNT。

返回值:被删除的成员数量。

7. 其它操作

7.1. Key通用操作

 KEYS pattern

获取所有匹配pattern参数的Keys。需要说明的是,在我们的正常操作中应该尽量避免对该命令的调用,因为对于大型数据库而言,该命令是非常耗时的,对Redis服务器的性能打击也是比较大的。pattern支持glob-style的通配符格式,如*表示任意一个或多个字符,?表示任意字符,[abc]表示方括号中任意一个字母。 匹配模式的键列表。

 DEL key [key …]

从数据库删除中参数中指定的keys,如果指定键不存在,则直接忽略。还需要另行指出的是,如果指定的Key关联的数据类型不是String类型,而是List、Set、Hashes和Sorted Set等容器类型,该命令删除每个键的时间复杂度为O(M),其中M表示容器中元素的数量。而对于String类型的Key,其时间复杂度为O(1)。

返回值:实际被删除的Key数量。

 EXISTS key

判断指定键是否存在。

返回值:1表示存在,0表示不存在。

 MOVE key db

将当前数据库中指定的键Key移动到参数中指定的数据库中。如果该Key在目标数据库中已经存在,或者在当前数据库中并不存在,该命令将不做任何操作并返回0。

返回值:移动成功返回1,否则0。

在redis.conf文件中定义了redis的默认库的数据数量

默认选择了第一个数据库(select 0)

我们可以使用select 数值 来进行库的切换: select 10.(这是选择了第11个

数据库

)

 RENAME key newkey

为指定的键重新命名,如果参数中的两个Keys的名字相同,或者是源Key不存在,该命令都会返回相关的错误信息。如果newKey已经存在,则直接覆盖。

 RENAMENX key newkey

如果新值不存在,则将参数中的原值修改为新值。其它条件和RENAME一致。

返回值:1表示修改成功,否则0。

 PERSIST key

如果Key存在过期时间,该命令会将其过期时间消除,使该Key不再有超时,而是可以持久化存储。

返回值:1表示Key的过期时间被移除,0表示该Key不存在或没有过期时间。

 EXPIRE key seconds

该命令为参数中指定的Key设定超时的秒数,在超过该时间后,Key被自动的删除。如果该Key在超时之前被修改,与该键关联的超时将被移除。

返回值:1表示超时被设置,0则表示Key不存在,或不能被设置。

 EXPIREAT key timestamp

该命令的逻辑功能和EXPIRE完全相同,唯一的差别是该命令指定的超时时间是绝对时间,而不是相对时间。该时间参数是Unix timestamp格式的,即从1970年1月1日开始所流经的秒数。

返回值:1表示超时被设置,0则表示Key不存在,或不能被设置。

 TTL key

获取该键所剩的超时描述。

返回值:返回所剩描述,如果该键不存在或没有超时设置,则返回-1。

 RANDOMKEY

从当前打开的数据库中随机的返回一个Key。

返回值:返回的随机键,如果该数据库是空的则返回nil。

 TYPE key

获取与参数中指定键关联值的类型,该命令将以字符串的格式返回。

返回值:返回的字符串为string、list、set、hash和zset,如果key不存在返回none。

7.2. 事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历以下三个阶段:

开始事务。MULTI

命令入队。

执行事务。EXEC

事务常用命令

 MULTI

Redis Multi 命令用于标记一个事务块的开始。

事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

返回值:总是返回OK

 EXEC

Redis Exec 命令用于执行所有事务块内的命令

返回值: 事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 nil 。

 DISCARD

Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。

返回值: 总是返回 OK 。

 WATCH

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

 UNWATCH

Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视

四、 Redis java客户端jedis

1. Jedis介绍与快速入门

通过java来操作redis使用jedis

搭建jedis环境

编写代码

程序执行报错:

原因:

1. redis服务器是否开启

2. linux的防火墙是否关闭

3. 在redis.conf配置文件中 bind 127.0.0.1 代表的是外部 不可以访问redis

通过以上操作,错误信息不一样了

原因:是我们没有设置密码

我们需要在redis.conf文件中设置密码

在命令行下连接redis

2. string类型常见操作

//string操作

public class JedisDemo2 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

// 演示 set get

@Test

public void test1() {

jedis.set(“username”, “tom”);

String value = jedis.get(“username”);

System.out.println(value);

}

//演示mset mget

@Test

public void test2(){

jedis.mset(“password”,“123”,“age”,“20”);

List values = jedis.mget(“username”,“password”,“age”);

System.out.println(values);

}

//演示 append setrange getrange

@Test

public void test3(){

//jedis.append(“username”," is boy");

//jedis.setrange(“username”, 7,“girl”);

System.out.println(jedis.get(“username”));

System.out.println(jedis.getrange(“username”, 7, -1));

}

}

3. list类型常见操作

//list操作

public class JedisDemo3 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

// 演示lpush lrange

@Test

public void test1() {

jedis.lpush(“names”, “tom”, “james”, “张三”, “李四”);

List names = jedis.lrange(“names”, 0, -1);

System.out.println(names);

}

// lset

@Test

public void test2() {

// jedis.lset(“names”, 1, “王五”);

// List names = jedis.lrange(“names”, 0, -1);

// System.out.println(names);

String value = jedis.lindex(“names”, 1);

System.out.println(value);

}

// linsert

@Test

public void test3() {

jedis.linsert(“names”, LIST_POSITION.BEFORE, “james”, “fox”);

List names = jedis.lrange(“names”, 0

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 开源分享

, -1);

System.out.println(names);

}

// lrem

@Test

public void test4(){

jedis.lrem(“names”, 1, “tom”);

List names = jedis.lrange(“names”, 0, -1);

System.out.println(names);

}

}

4. hash类型常见操作

//hash操作

public class JedisDemo4 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

// 演示hset hget

@Test

public void test1() {

jedis.hset(“user”, “username”, “tom”);

String value = jedis.hget(“user”, “username”);

System.out.println(value);

}

// 演示hmset hmget

@Test

public void test2() {

Map hash = new HashMap();

hash.put(“password”, “123”);

hash.put(“sex”, “male”);

jedis.hmset(“user”, hash);

List values = jedis.hmget(“user”, “username”, “password”, “sex”);

System.out.println(values);

}

//演示 hgetall hkeys kvals

@Test

public void test3(){

Map map = jedis.hgetAll(“user”);

for(String key:map.keySet()){

System.out.println(key+" "+map.get(key));

}

Set keys = jedis.hkeys(“user”);

System.out.println(keys);

List values = jedis.hvals(“user”);

System.out.println(values);

}

// 演示hdel

@Test

public void test4(){

jedis.hdel(“user”, “username”,“password”);

Map map = jedis.hgetAll(“user”);

for(String key:map.keySet()){

System.out.println(key+" "+map.get(key));

}

}

}

5. set类型常见操作

//set操作

public class JedisDemo5 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

//演示sadd smembers

@Test

public void test1(){

jedis.sadd(“language1”,“java”,“c++”,“ruby”,“python”);

Set smembers = jedis.smembers(“language1”);

System.out.println(smembers);

}

//演示srem

@Test

public void test2(){

jedis.srem(“language1”, “java”);

Set smembers = jedis.smembers(“language1”);

System.out.println(smembers);

}

//差集 sdiff

@Test

public void test3(){

jedis.sadd(“language1”,“java”,“c++”,“ruby”,“python”);

jedis.sadd(“language2”,“ios”,“c++”,“c#”,“android”);

Set sdiff = jedis.sdiff(“language1”,“language2”);

System.out.println(sdiff);

}

//交集

@Test

public void test4(){

jedis.sadd(“language1”,“java”,“c++”,“ruby”,“python”);

jedis.sadd(“language2”,“ios”,“c++”,“c#”,“android”);

Set sinter = jedis.sinter(“language1”,“language2”);

System.out.println(sinter);

}

//并集

@Test

public void test5(){

jedis.sadd(“language1”,“java”,“c++”,“ruby”,“python”);

jedis.sadd(“language2”,“ios”,“c++”,“c#”,“android”);

Set sunion = jedis.sunion(“language1”,“language2”);

System.out.println(sunion);

}

}

6. sortedSet类型常见操作

//sortedset操作

public class JedisDemo6 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

// 演示zadd zrange zrangeByScore

@Test

public void test1() {

Map sm = new HashMap();

sm.put(“张三”, 70.0);

sm.put(“李四”, 80.0);

sm.put(“王五”, 90.0);

sm.put(“赵六”, 60.0);

jedis.zadd(“zkey”, sm);

Set set = jedis.zrange(“zkey”, 0, -1);

System.out.println(set);

// 根据分数获取

Set set1 = jedis.zrangeByScore(“zkey”, 70.0, 90.0);

System.out.println(set1);

}

// 获取分数元素 zrangeWithScores

@Test

public void test2() {

Map sm = new HashMap();

sm.put(“张三”, 70.0);

sm.put(“李四”, 80.0);

sm.put(“王五”, 90.0);

sm.put(“赵六”, 60.0);

jedis.zadd(“zkey”, sm);

Set zws = jedis.zrangeWithScores(“zkey”, 0, -1);

for (Tuple t : zws) {

System.out.println(t.getScore() + " " + t.getElement());

}

}

// zrank,返回一个Long类型的值,代表序号,分数越小,越低(从0开始)

@Test

public void test3() {

Map sm = new HashMap();

sm.put(“张三”, 70.0);

sm.put(“李四”, 80.0);

sm.put(“王五”, 90.0);

sm.put(“赵六”, 60.0);

jedis.zadd(“zkey”, sm);

Long num = jedis.zrank(“zkey”, “赵六”);

System.out.println(num);

}

// zscore

@Test

public void test4() {

Map sm = new HashMap();

sm.put(“张三”, 70.0);

sm.put(“李四”, 80.0);

sm.put(“王五”, 90.0);

sm.put(“赵六”, 60.0);

jedis.zadd(“zkey”, sm);

Double zscore = jedis.zscore(“zkey”, “张三”);

System.out.println(zscore);

}

// zrem

@Test

public void test5() {

Map sm = new HashMap();

sm.put(“张三”, 70.0);

sm.put(“李四”, 80.0);

sm.put(“王五”, 90.0);

sm.put(“赵六”, 60.0);

jedis.zadd(“zkey”, sm);

jedis.zrem(“zkey”, “李四”);

Set zws = jedis.zrangeWithScores(“zkey”, 0, -1);

for (Tuple t : zws) {

System.out.println(t.getScore() + " " + t.getElement());

}

}

}

7. key的常见操作

//key的通用操作

public class JedisDemo7 {

Jedis jedis;

@Before

public void createJedis() {

jedis = new Jedis(“192.168.19.128”);

// 设置密码

jedis.auth(“admin”);

}

// keys patten

@Test

public void test1(){

Set keys = jedis.keys("*");

System.out.println(keys);

}

// del key

@Test

public void test2(){

Long del = jedis.del(“user”);

System.out.println(del);

}

//关于key时间设置

@Test

public void test3(){

//jedis.expire(“username”, 200); //设置生命周期为200秒

jedis.persist(“username”);

Long ttl = jedis.ttl(“username”); //获取生命周期值

System.out.println(ttl);

}

}

五、 Redis数据持久化

Redis将内存存储和持久化存储相结合,即可提供数据访问的高效性,又可保证数据存储的安全性

1. Redis数据持久化机制介绍

1). RDB持久化:

该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。

2). AOF(append only file)持久化:

该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

3). 同时应用AOF和RDB。

4). 无持久化:

可通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了

2. Redis数据持久化配置与测试

 RDB快照方式:

缺省情况下,Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开redis.conf文件之后,我们搜索save,可以看到下面的配置信息:

 save 900 1

#在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

 save 300 10

#在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

 save 60 10000

#在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。

注意:关于dump.rdb文件存储的位置,它是设置是在redis.conf文件中

dir ./

这段配置指的是服务器启动时的当前路径。

 AOF日志文件方式:

 AOF日志持久化机制的开启:

将appendonly no 改为

appendonly yes

 AOF同步方式的配置:

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always #每次有数据修改发生时都会写入AOF文件。

appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync no #从不同步。高效但是数据不会被持久化。

3. RDB与AOF对比总结

 RDB存在哪些优势呢?

1). 数据的备份和恢复非常方便,因为一个数据库只有一个持久化文件

2). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

3). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

 RDB又存在哪些劣势呢?

你可能感兴趣的:(程序员,面试,java,后端)