Redis总结和提取常用的和重要的命令

时间:2023-03-08 18:59:12

一:Redis的结构和其数据类型(注redis默认端口号是6379)

1)Redis可以部署多套(多个进程不同端口或直接部署在不同主机),每个Redis都可以有多个db,通过select来选择,默认的是select 0,选择新db后如果不插入任何值那么此db在服务端是不存在的;目前db只有index没有名字。

2)Redis的每个db其实都可以理解为java的ConcurrentHashMap对象,key是String,value是Object;key应该不能为null和空字符串,而value的Object又被限制为固定的几种类型,其中最常用的:

1.String,它可以存储任意数据(对于编程语言操作redis实际上key和value都是字节流数据),但是限定在512M;

2.List类型,它可以理解为java的LinkedList,值可以重复,但是只能通过下标访问而不能像Set一样sismember来判断,毕竟Redis是提供高效的缓存,不提供一些低效操作也正常。

3.Hash类型,可以理解为java的HashMap,即Map的value还是Map;

4.Set类型,和List一样也是obj的集合,不同的是它不允许重复值,且其值都经过了hash(就像java的HashSet),由于value(其实是HashMap的key部分)是hash过的,故提供sismember命令;

5.Sorted Set(zset),可以理解为java的LinkedHashSet,即它比set多了个顺序,但是这里注意,这个顺序不是说add时有序,而是遍历时通过一个head来有序的访问,它们存储位置上和set没有区别,只是node里多了privious和tail;

二:通用的操作

补充:控制台登录redis客户端可以 直接输入redis-cli,如果要登录非本地的redis服务则是redis-cli -h host_value;同理,如果端口是非6379则加-p port_value;

补充:./redis-cli -p 6379 shutdown命令可以直接关闭redis服务;(有auth可以加个-a xxx,如果host不是默认的可以加-h xxx)

1)select n,其中n是自然数,客户端连接后默认是0,即第一个db(ConcurrentHashMap对象),这个的存在可以有效的提供多个模块用同一个redis服务但是存在同名的key的问题(虽然可以在key里加后缀),但是对于不同的大应用还是建议用多个redis。

2)ping,用于探测服务端和自己的连接是否正常,正常返回pong;

3)auth命令,用于登录(前提是redis服务有配置密码),如果有密码,那么即便执行echo命令也会提示要登录,通过auth passwd来登录;

4)quit命令,关闭当前连接,类似自动版的Ctrl+C;

5)save命令,将内存数据异步保存到磁盘的.db文件里(前提是配置了),还有个bgsave,后它异步保存

6)shutdown命令,异步保存数据到磁盘,并且关闭  redis  服务;

7)info命令,显示redis.conf的所有键值对配置,可以info selection来指定要显示哪个键的键值对。

8)flushdb和flushall命令,前者是清空当前内存db的数据,后者是清空所有内存db的数据(但是已经在磁盘的是否会清除待测);此时用dbsize会返回0;

9)dbsize命令,显示当前db的key-value条数。

10)config set命令,动态的设置redis.conf的配置,无需重启服务,如config set requirepass "password"即是设置redis需要密码;config get则是获取某个键的值(和info selection的关系待测);

11)time命令,获取redis服务的时间,有时候我们设置时间可能不能以本机的为准,这个时候这个命令会挺有用。

12)command count命令,获取当前版本redis里所有可用命令的总数,我得到的是176,够够的。。

13)command命令,获取命令详情,有点像--help;不过用处不大,还不如查资料学的快。

14)client kill关闭特定客户端连接,如kill 127.0.0.1:53338,注意这个addr是客户端的地址。可以事先用client list看当前有哪些客户端在连接。(经过测试关闭连接实际上是取消授权,即需要再次auth而不是关闭客户端的意思)

15)multi和exec命令,这两个命令是成对出现的(除非命令有问题用了discard取消事务),先用multi声明事务,然后写事务命令,然后用exec提交事务,提交的事务等同于一个原子命令集合。

16)discard命令,如果multi后输入的命令有语法问题,则可以用discard取消此次事务并清空缓存的命令;当然没错误也可以用这个命令取消事务,用了discard后面就不存在exec了;(错误还有一种运行时错误,即服务端执行出错而非客户端自己离线就能检测的)

17)watch命令,监视一个key,这个用法是在multi之前使用watch key,然后在multi,然后输入命令和exec提交事务,如果在watch之后exec之前此key被更改(删除/修改值,增加算吗?待测)则此事务不生效,这一般是多个连接客户端的情况下有这个需求。

18)unwatch命令,取消对key的监视;

19)del命令,用于删除当前db的key-value(不管此value是什么类型)

20)exists命令,判断key是否存在,如exists stud1;存在返回1,不存在返回0;

21)expire命令,给key设定过期时间,单位是秒,如expire stud1;pexpire则是设置毫秒为单位的过期时间;

22)ttl命令(time to live),查看key的过期剩余时间,单位是秒,如ttl stud1;pttl则是返回毫秒为单位的过期时间,expire和ttl并不是要对应使用。(如果ttl或pttl的key不存在则返回-2)

23)persist命令,移除key的过期时间,即不设置过期时间。

24)move命令,将当前db的key移动到指定db里,如move stud1 1;成功返回1,否则返回0;

25)keys命令,返回所有指定模式的key,如keys aa*,则如果存在key:aam,aas都会返回,这里*是通配符匹配任意长度字符串;(keys *返回所有的key,注意不包括value部分)

26)rename命令,将key重命名,如rename oldname newname;这里如果已经存在newname则会覆盖(至少string的会直接覆盖,而其它类型是否覆盖待测);renamenx则是newname在db中没有则rename否则不执行返回0;

27)type命令,查看key的value类型,如type name返回string;

28)info命令,可以查看redis服务的版本、当前连接客户端数、内存等等一大堆信息;

三:各数据类型的常用操作命令

1)String类型:

1.set,如set name silentdoer;注意,如果name已经存在则覆盖,且无视name对应value的类型(而其它类型如hash,set时如果key的类型和hash不一样则返回执行出错信息),如果字符串包括空白符可以用""引起来。

2.get,如get name返回字符串silentdoer;

3.getrange,如getrange name 0 2;则返回sil,0和2是下标,如果end是-1,则表示到末尾的意思。

4.getset,set的升级版,即返回的不再是OK而是旧值,如果此key之前没有则返回nil;而如果此key存在但是不是string类型则返回出错信息(因为这里需要返回旧值,而旧值不是string类型)

5.getbit和setbit;直接操作value的位,不过只适合小数据;如getbit ctl 63;setbit ctl 62 1;(jedis里key-value均为byte数组)

6.mget,一次性获取多个key的值(编程语言里是存入结果集数组),如mget name1 name2

7.setex,set值的同时给它赋予过期时间,单位是秒,如setex key 60 value;这个功能set也能做只需后面加个ex 60即可,而且可以设置毫秒px 60000;完整句型为set key value ex 60;还有个psetex和incrbyfloat

8.setnx(set not exists),句型setnx key value,则只有key不存在才会创建并set;成功返回1,否则返回0

9.mset,和mget对应,同时设置多个键值对;即是多次set

10.incr和decr分别是对key加一减一且返回加减之后的值,这个是原子操作,因此可作为分布式锁的一种实现;前提是key的value是整数数值(ascii码是数值),而incrby则是加指定数,如incrby key 3,对应的decrby;

11.append对key的value追加字符串;如append key appendstr

2)Hash类型,即类似java HashMap

1.hset命令,添加或修改一个hash;如hset key field value;注意,如果key已经存在且不是hash类型则返回错误信息;而对是hash的key操作是修改此hash而非覆盖(修改包括添加新field和修改老field)。

2.hget命令,获取一个hash的field的值,如hget key field;

3.hmset,添加或修改一个hash,不同的是可以一次性指定多个field-value;如hmset key field1 value1 field2 value2...;对应hmget

4.hgetall,获取hash所有的field-value;

5.hexists,查询hash中是否存在某个field,如hexists key field

6.hdel,删除hash中的field,如hdel key field(可同时删除多个,不存在hmdel)

7.hkeys,获取hash的所有key,如hkeys key;对应hvals获取所有的值

8.hlen,获取hash有多少field-value;如hlen key;

9.hsetnx,如果field不存在才设置,如hsetnx key field value,如果field已存在返回0(这个跟set不同的是set虽然已存在也返回0但是会set而这个不set);

10.hincrby命令,可以对field元素进行增加操作,如果key不存在则创建一个Hash元素并对应field初始值为0再执行此hincrby操作;

3)List类型(可以有重复元素,如果没有重复元素建议用set,如果要有顺序用zset)

1.llen获取列表的长度

2.rpush,将一个或多个值添加到列表的尾部(列表不存在则创建),语法为rpush key value1 value2 ...;还有个rpushex是为已存在的列表添加元素;

3.rpop,移除并获取列表的最后一个值(单个),格式为rpop list;还有个brpop,表示如果没有元素可以rpop则等待超时或有元素则rpop;格式为brpop list 60(60秒),还有个blpop

4.lpush,将一个或多个值添加到列表的头部,还有个lpushex对应是要此列表已存在;语法为lpush key value1 value2

5.lpop,移除并获取第一个元素。

6.linsert,在列表里选个元素之前或之后插入新元素,语法为linsert key before|after eValue nValue

7.lrange获取指定范围内的元素,如lrange key 0 -1,-1表示到最后

8.lrem移除列表中指定的值的对应个数的元素,还可以指定搜索顺序,如lrem list -2 "stud"表示移除list中值为stud的元素移除两个,搜索顺序为从后往前(如果是2则是从前往后)

9.lindex通过索引获取list中的元素;下标从0开始,-1表示最后一个元素;

4)Set类型

1.sadd,向set集合添加一个或多个元素,语法为sadd setKey member1 member2 ..;

2.scard获取集合的成员数量,如scard setKey;返回setKey中有多少个成员(set是成员不重复的和HashSet一样)。

3.sdiff获取集合的差集,语法为sdiff key1 key2 key3...;最终结果是key1减去key2减去key3最终key集合剩下的元素个数,注意,这里只是减去相同的部分,不同的不管,如果没有指定要减的集合或不存在则视为空集;

4.sdiffstore将sdiff的结果存入destination集合里,不存在则创建(若是已存在且不为set类型报错),格式为sdiffstore destionation key1 key2 key3...;

5.sinter (intersection)返回给定集合的交集;格式为sinter key1 key2..;

6.sinterstore,和将交集存入destionation集合,格式为sinterstore dest key1 key2..;(注意这个和sdiffstore一样是覆盖整个dest而不是往dest里添加元素)

7.sismember,判断set里是否有member;格式为sismember setKey "member";有member返回1否则0;

8.smembers,返回集合中所有成员;

9.srem,移除set中一个或多个成员,格式为srem setKey m1 m2...;如果m1不存在则相当于没写此member不会影响其它member的srem,且返回的值是成功移除的个数;

10.sunion,返回多个集合的并集,如sunion key1 key2..;

11.sunionstore,存储并集,格式为sunionstore dest key1 key2 ..;

5)ZSet类型(Sorted Set)

1.zadd 向有序集合添加一个或多个成员,或更新已存在成员的分数。

2.zcard 获取有序集合的成员数,如zcard myzset

3.zrange 返回集合在有序区间的所有成员,-1表示到最后;如zrange myzset 0 -1

4.zrem 移除有序集合上一个或多个成员,如zrem myzset m1 m2..;返回成功移除的个数。

5.zscore 获取指定的有序集合中某个成员的score;如zscore myzset m1;