redis笔记-1-了解

来源:互联网 发布:伊斯坦布尔之夜 知乎 编辑:程序博客网 时间:2024/06/05 04:23

redis支持的数据类型
字符串类型
散列类型
列表类型
集合类型
有序集合类型
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述
redis数据库中的所有数据都存储在内存中,由于内存的读写速度远快于硬盘,所以redis数据库在性能上远高于其他基于硬盘存储的数据库。

redis可以为每一个键设置生存时间,生存时间到期后,键会自动被删除。

redis的启动

在redis文件对应的目录启动服务器,命令如下

redis-server.exe redis.conf或(根据不同的版本)E:\soft\redis\redissoft>redis-server.exe  redis.windows.conf

客户端的启动,命令如下,注意ip地址

E:\soft\redis-2.4.5-win32-win64\64bit>redis-cli.exe -h 127.0.0.1 -p 6379

测试:

redis 127.0.0.1:6379> set lu jiangOKredis 127.0.0.1:6379> get lu"jiang"redis 127.0.0.1:6379>

redis数据类型:
1.字符串类型:
设置一个字符串,并获取:

redis 127.0.0.1:6379> set cao 'aaa'OKredis 127.0.0.1:6379> get cao"aaa"

查询所有的键值:

redis 127.0.0.1:6379> keys *1) "cao"2) "bar"3) "lu"//查询所有以c开头的键值redis 127.0.0.1:6379> keys c*1) "cao"

判断一个键是否存在

redis 127.0.0.1:6379> exists cao(integer) 1

删除一个键

redis 127.0.0.1:6379> del cao(integer) 1//也可以删除多个键,返回的是删除键的个数redis 127.0.0.1:6379> del bar lu(integer) 2redis 127.0.0.1:6379> get cao(nil)

返回键的值的数据类型

redis 127.0.0.1:6379> set cao 'aaaa'OKredis 127.0.0.1:6379> type caostring

注:一个字符串类型的键最大存储数据的容量是512MB

递增数字:
字符串类型可以存储任何形式的字符串,当存储的字符串是以整数形式时,redis提供一个命令INCR,其作用是让当前值递增
命令:INCR key

redis 127.0.0.1:6379> incr i(integer) 1redis 127.0.0.1:6379> incr i(integer) 2redis 127.0.0.1:6379> get i"2"redis 127.0.0.1:6379> type istringredis 127.0.0.1:6379> set j 1OKredis 127.0.0.1:6379> incr j(integer) 2redis 127.0.0.1:6379> get j"2"//incrby 指定一次增加的数值redis 127.0.0.1:6379> incrby j 4(integer) 6redis 127.0.0.1:6379> get  j"6"//decr 递减数值redis 127.0.0.1:6379> decr j(integer) 5redis 127.0.0.1:6379> get j"5"//指定减少的数值redis 127.0.0.1:6379> decrby j 3(integer) 2redis 127.0.0.1:6379> get j"2"redis 127.0.0.1:6379>//向字符串尾部追加字符redis 127.0.0.1:6379> APPEND j 'a'(integer) 2redis 127.0.0.1:6379> get j"2a"//获取字符串的长度redis 127.0.0.1:6379> strlen j(integer) 2redis 127.0.0.1:6379> set j '哪汉'OKredis 127.0.0.1:6379> strlen j(integer) 4//同时设置多个键值redis 127.0.0.1:6379> mset  k1 'a' k2 'b' k3 cOKredis 127.0.0.1:6379> get k3"c"//同时获取多个键值redis 127.0.0.1:6379> mget k1 k31) "a"2) "c"

位操作:(redis提供了几个命令直接对二进制位进行操作)
ASCII中A对应十进制65,一次往后推,a对应97
这里写图片描述

redis 127.0.0.1:6379> set foo barOK//getbit获取指定位置上的二进制数值redis 127.0.0.1:6379> getbit foo 0(integer) 0redis 127.0.0.1:6379> getbit foo 1(integer) 1redis 127.0.0.1:6379> getbit foo 2(integer) 1redis 127.0.0.1:6379> getbit foo 3(integer) 0redis 127.0.0.1:6379> getbit foo 4(integer) 0redis 127.0.0.1:6379> getbit foo 5(integer) 0redis 127.0.0.1:6379> getbit foo 6(integer) 1redis 127.0.0.1:6379> getbit foo 7(integer) 0redis 127.0.0.1:6379> getbit foo 8(integer) 0redis 127.0.0.1:6379> getbit foo 9(integer) 1redis 127.0.0.1:6379> getbit foo 10(integer) 1redis 127.0.0.1:6379> getbit foo 11(integer) 0redis 127.0.0.1:6379> getbit foo 12(integer) 0redis 127.0.0.1:6379> getbit foo 13(integer) 0redis 127.0.0.1:6379> getbit foo 14(integer) 0redis 127.0.0.1:6379> getbit foo 15(integer) 1redis 127.0.0.1:6379> getbit foo 16(integer) 0redis 127.0.0.1:6379> getbit foo 17(integer) 1redis 127.0.0.1:6379> getbit foo 18(integer) 1redis 127.0.0.1:6379> getbit foo 19(integer) 1redis 127.0.0.1:6379> getbit foo 20(integer) 0redis 127.0.0.1:6379> getbit foo 21(integer) 0redis 127.0.0.1:6379> getbit foo 22(integer) 1redis 127.0.0.1:6379> getbit foo 23(integer) 0//超过了foo,23位以后都显示0redis 127.0.0.1:6379> getbit foo 24(integer) 0

更改对应位置上的二进制

redis 127.0.0.1:6379> setbit foo 6 0(integer) 1redis 127.0.0.1:6379> setbit foo 7 1(integer) 0redis 127.0.0.1:6379> get foo"aar"//当setbit设置的位数操作变量的位数,会将对应的8为自动补0redis 127.0.0.1:6379> set foo barOK//设置25位为1后,24-31位除25位以外其余都是0redis 127.0.0.1:6379> setbit foo 25 1(integer) 0redis 127.0.0.1:6379> setbit foo 26 1(integer) 0redis 127.0.0.1:6379> setbit foo 30 1(integer) 0//设置后foo从24-31位数据分别为01100010=2^1+2^5+2^6=98对应为b字母redis 127.0.0.1:6379> get foo"barb"

二进制的运算

127.0.0.1:6379> SET foo1 barOK127.0.0.1:6379> SET foo2 aarOK127.0.0.1:6379> get foo1"bar"127.0.0.1:6379> get foo2"aar"127.0.0.1:6379> BITOP OR  res  foo1 foo2(integer) 3127.0.0.1:6379> get res"car"

这里写图片描述

统计二进制中数值为1的个数

//统计键foo对应值的二进制中为1的个数127.0.0.1:6379> bitcount foo1(integer) 10//还可以统计指定开始字节和结束字节的二进制中对应为1的个数127.0.0.1:6379> bitcount foo1 0 1(integer) 6127.0.0.1:6379> bitcount foo1 0 0(integer) 3127.0.0.1:6379> bitcount foo1 0 1(integer) 6127.0.0.1:6379> bitcount foo1 0 2(integer) 10127.0.0.1:6379> bitcount foo1 1 2(integer) 7127.0.0.1:6379> bitcount foo1 2 2(integer) 4

2.散列类型:
散列类型一个键对应多个字段,每个字段对应一个字段值。
注:字段值只能是字符串类型,故不能嵌套

//键位car,字段为price,字段值500127.0.0.1:6379> hset car price 500(integer) 0127.0.0.1:6379> hset car name HWM(integer) 0//取字段值127.0.0.1:6379> hget car name"HWM"//设置多个字段值127.0.0.1:6379> hmset car id 1 yy 2OK//获取多个字段值127.0.0.1:6379> hmget car id name price1) "1"2) "HWM"3) "500"//获取所有的字段和其对应的字段值127.0.0.1:6379> hgetall car1) "price"2) "500"3) "name"4) "HWM"5) "id"6) "1"7) "yy"8) "2"//判断字段是否存在:127.0.0.1:6379> hexists car name(integer) 1//存在name字段127.0.0.1:6379> hexists car dds(integer) 0//不存在dds字段//字段不存在时才赋值,否则不赋值127.0.0.1:6379> hsetnx car name ssss(integer) 0127.0.0.1:6379> hget car name"HWM"127.0.0.1:6379> hsetnx car qq 11122(integer) 1127.0.0.1:6379> hget car qq"11122"//字段值增加对应的数127.0.0.1:6379> hincrby car id 2//将id加上2(integer) 3127.0.0.1:6379> hget car id"3"//删除字段127.0.0.1:6379> hdel car id(integer) 1127.0.0.1:6379> hget car id(nil)//只获取对应键的字段名127.0.0.1:6379> hkeys car1) "price"2) "name"3) "yy"4) "qq"//只获取对应键的字段值127.0.0.1:6379> hvals car1) "500"2) "HWM"3) "2"4) "11122"//获取对应键的字段数量127.0.0.1:6379> hlen car(integer) 4

3.列表类型

//向列表numbers的左边添加元素1127.0.0.1:6379> lpush numbers 1(integer) 1//向列表numbers的左边添加多个元素127.0.0.1:6379> lpush numbers 2 3//向列表的右边添加多个元素127.0.0.1:6379> rpush numbers 0 -1(integer) 5//弹出列表最左边的元素127.0.0.1:6379> lpop numbers"3"//弹出列表最后边的元素127.0.0.1:6379> rpop numbers"-1"//获取当前列表中元素的个数127.0.0.1:6379> llen numbers(integer) 3//获取列表片段(列表下标从0开始,从列表的左边开始)语法:lrange key start stop如果start比stop大,返回null如果stop超过实际索引范围,则返回到列表的最右边的元素127.0.0.1:6379> lrange numbers 0 0//下标为0的值1) "2"127.0.0.1:6379> lrange numbers 1 1//下标为1的值1) "1"127.0.0.1:6379> lrange numbers 2 2//下标为2的值1) "0"127.0.0.1:6379> lrange numbers 0 1//下标为0到1的值1) "2"2) "1"127.0.0.1:6379> lrange numbers 0 2//下标为0到2的值1) "2"2) "1"3) "0"127.0.0.1:6379> lrange numbers 1 2//下标为1到2的值1) "1"2) "0"列表也支持从右边开始(为负数),-1表示列表最右边的元素127.0.0.1:6379> lrange numbers -1 -11) "0"127.0.0.1:6379> lrange numbers -2 -21) "1"127.0.0.1:6379> lrange numbers -3 -31) "2"//从列表的左边开始删除列表中指定的值语法:lrem key count valuecount > 0 : 从列表的左边开始删除前count个值为values的元素count < 0 : 从列表的右边开始删除前|count|个值为values的元素count = 0 : 删除列表中所有值为value的元素127.0.0.1:6379> lrange numbers 0 1001) "3"2) "1"3) "2"4) "2"5) "1"6) "0"7) "2"8) "4"127.0.0.1:6379> lrem numbers 1 2//从列表的左边开始删除1个字段值为2(integer) 1127.0.0.1:6379> lrange numbers 0 1001) "3"2) "1"3) "2"4) "1"5) "0"6) "2"7) "4"//获取指定索引对应的元素值127.0.0.1:6379> lindex numbers 0//获取索引为0对应的值"3"127.0.0.1:6379> lindex numbers 1"1"127.0.0.1:6379> lindex numbers 2"2"//设置置顶元素的值127.0.0.1:6379> lset numbers 0 33//设置索引为0元素的值为‘33’OK127.0.0.1:6379> lindex numbers 0"33"//只保留指定片段127.0.0.1:6379> ltrim numbers 0 4//只保留索引为0到4的元素OK127.0.0.1:6379> lrange numbers 0 1001) "33"2) "1"3) "2"4) "1"5) "0"//在指定的值后面插入元素语法:linsert key before/after privot value从列表的左边开始查找,找到值为privot对应的元素,在看设置的是before还是after,插入value127.0.0.1:6379> lrange numbers 0 1001) "33"2) "1"3) "2"4) "1"5) "0"127.0.0.1:6379> linsert numbers after 1 -1//从列表的左边开始找,找到值为1的元素后边插入-1(integer) 6127.0.0.1:6379> lrange numbers 0 1001) "33"2) "1"3) "-1"4) "2"5) "1"6) "0"

4.集合类型:
集合当中不会有形同的元素

//向集合letters添加元素a127.0.0.1:6379> sadd letters a(integer) 1//查看集合中所有的元素127.0.0.1:6379> smembers letters1) "a"//因为集合中已经存在a,所以不会再添加a127.0.0.1:6379> sadd letters a b c(integer) 2127.0.0.1:6379> smembers letters1) "c"2) "b"3) "a"//删除集合中的元素127.0.0.1:6379> srem letters c d(integer) 1//d不再集合当中,故返回1127.0.0.1:6379> smembers letters1) "b"2) "a"//判断元素时候在集合当中127.0.0.1:6379> sismember letters a(integer) 1 //a在集合当中127.0.0.1:6379> sismember letters d(integer) 0 //d不再集合当中

集合当中的运算:
差集:sdiff
这里写图片描述

127.0.0.1:6379> sadd seta 1 2 3(integer) 3127.0.0.1:6379> sadd setb 2 3 5(integer) 3127.0.0.1:6379> sdiff seta setb1) "1"

交集:sinter
这里写图片描述

127.0.0.1:6379> sadd seta 1 2 3(integer) 3127.0.0.1:6379> sadd setb 2 3 5(integer) 3127.0.0.1:6379> sinter seta setb1) "2"2) "3"

并集:sunion
这里写图片描述

127.0.0.1:6379> sadd seta 1 2 3(integer) 3127.0.0.1:6379> sadd setb 2 3 5(integer) 3127.0.0.1:6379> sunion seta setb1) "1"2) "2"3) "3"4) "5"

将上面集合运算存入到键当中,而不是显示

127.0.0.1:6379> sdiffstore cc seta setb(integer) 1127.0.0.1:6379> smembers cc1) "1"127.0.0.1:6379> sinterstore dd seta setb(integer) 2127.0.0.1:6379> smembers dd1) "2"2) "3"127.0.0.1:6379> sunionstore ee seta setb(integer) 4127.0.0.1:6379> smembers ee1) "1"

得到集合当中元素的个数

127.0.0.1:6379> smembers letters1) "b"2) "a"127.0.0.1:6379> scard letters(integer) 2

随机获得集合当中的一个元素

127.0.0.1:6379> srandmember ee"2"127.0.0.1:6379> srandmember ee"1"//还可以设置随机获取元素的个数127.0.0.1:6379> srandmember ee 21) "5"2) "1"127.0.0.1:6379> srandmember ee 21) "2"2) "1"

从集合当中弹出元素

127.0.0.1:6379> smembers ee1) "1"2) "2"3) "3"4) "5"127.0.0.1:6379> spop ee//默认弹出元素的个数为1"3"127.0.0.1:6379> smembers ee1) "1"2) "2"3) "5"127.0.0.1:6379> spop ee 2//设置弹出元素的个数1) "1"2) "2"127.0.0.1:6379> smembers ee1) "5"

5.有序集合类型:

//添加元素127.0.0.1:6379> zadd scoreboard 89 tom 67 peter 100 david(integer) 3//对元素值进行覆盖127.0.0.1:6379> zadd scoreboard  89 peter(integer) 0127.0.0.1:6379> zadd testboard 1.5 b(integer) 1//获取元素值127.0.0.1:6379> zscore scoreboard tom"89"//获取数值在指定返回的元素语法:zrangebyscore key min max [withscores] [limit offset count]127.0.0.1:6379> zadd scoreboard 89 tom 67 peter 100 david(integer) 0127.0.0.1:6379> zrangebyscore scoreboard 80 100//大于等于80小于等于1001) "tom"2) "david"127.0.0.1:6379> zrangebyscore scoreboard 80 (100 //大于等于80小于1001) "tom"127.0.0.1:6379> zrangebyscore scoreboard (89 +inf //大于89,不包含891) "david"127.0.0.1:6379> zrangebyscore scoreboard 89 +inf //大于等于891) "tom"2) "david"//遍历集合当中所有的元素127.0.0.1:6379> zrange scoreboard 0 -11) "peter"2) "tom"3) "david"127.0.0.1:6379> zrange scoreboard 0 -1 withscores1) "peter"2) "67"3) "tom"4) "89"5) "david"6) "100"127.0.0.1:6379> zrangebyscore scoreboard 60 +inf limit 1 21) "tom"2) "david"有上面我们知道peter,tom,david都大于60zrangebyscore scoreboard 60 +inf查出所有大于60的元素limit 1 2和sql当中一样,下标是从0开始,联合上面,也就是从大于60的第二个元素开始,找两个元素

某个元素的值的增减

127.0.0.1:6379> zscore scoreboard tom"89"127.0.0.1:6379> zincrby scoreboard  4 tom //减少的话用-4"93"127.0.0.1:6379> zscore scoreboard tom"93"

其余的一些命令:

//获取集合当中元素的个数127.0.0.1:6379> zcard scoreboard(integer) 3//获取集合当中指定范围元素的个数127.0.0.1:6379> zcount scoreboard 60 90(integer) 1//删除指定元素127.0.0.1:6379> zrem scoreboard tom(integer) 1127.0.0.1:6379> zrange scoreboard 0 -11) "gg"2) "ff"3) "peter"4) "kk"5) "tom"6) "tt"7) "david"127.0.0.1:6379> zrange scoreboard 0 -1 withscores 1) "gg" 2) "23" 3) "ff" 4) "44" 5) "peter" 6) "67" 7) "kk" 8) "86" 9) "tom"10) "89"11) "tt"12) "99"13) "david"14) "100"127.0.0.1:6379> zremrangebyrank scoreboard 1 3 //按照集合的排序删除元素(integer) 3127.0.0.1:6379> zrange scoreboard 0 -11) "gg"2) "tom"3) "tt"4) "david"//按照元素值得范围删除127.0.0.1:6379> zremrangebyscore scoreboard 0 90(integer) 2127.0.0.1:6379> zrange scoreboard 0 -11) "tt"2) "david"

获取指定元素的排名

//从小到大的排名127.0.0.1:6379> zrank scoreboard tt(integer) 0//从大到小的排名127.0.0.1:6379> zrevrank scoreboard tt(integer) 1

事务:
一个事务要么都执行,要么都不执行。
案例:

localhost:6379> multiOKlocalhost:6379> sadd "user:1:following" 2QUEUEDlocalhost:6379> sadd "user:2:followers" 1QUEUEDlocalhost:6379> exec1) (integer) 12) (integer) 1

如果客户端在命令exec之前掉线了,redis就会清空任务队列,所有命名都不会执行。
如果客户端在发送命令exec之后掉线,所有的命令也都会执行。

事务的错误处理
1.语法错误:
案例

localhost:6379> set aas ddQUEUEDlocalhost:6379> set aas(error) ERR wrong number of arguments for 'set' commandlocalhost:6379> errorcommand aas(error) ERR unknown command 'errorcommand'localhost:6379> exec(error) EXECABORT Transaction discarded because of previous errors.

在multi命令之后执行了三个命令,一个是正确的命令,成功的加入事务队列,其余的两个命令都是“语法错误”的命令,而只要有一个命令是错误的,执行exec命令之后redis就会直接返回错误,连语法正确的都不会执行
如下,查询aas:

localhost:6379> get aas(nil)

2.运行错误:
案例:

localhost:6379> multiOKlocalhost:6379> set qa 1QUEUEDlocalhost:6379> sadd qa 2QUEUEDlocalhost:6379> set qa 3QUEUEDlocalhost:6379> exec1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value3) OKlocalhost:6379> get qa"3"

可见虽然第二条命令(add qa 2)出错了,但是第三条命令依然执行了,redis没有提供回滚的功能,这便要开发者自己在执行错误后,自己处理。

命令watch:用于监控一个或多个键,一旦其中有一个键被修改或删除,之后的事物就不会执行,直到执行到exec命令之后才会执行。

案例

localhost:6379> set key 1OKlocalhost:6379> watch keyOKlocalhost:6379> set key 2OKlocalhost:6379> get key"2"localhost:6379> multiOKlocalhost:6379> set key 3QUEUEDlocalhost:6379> exec(nil)localhost:6379> get key"2"localhost:6379> set key 4OKlocalhost:6379> get key"4"

键的生成时间:
案例:

localhost:6379> set foo barOKlocalhost:6379> ttl foo // 查看键还剩多少时间,没有设置时间的返回-1(integer) -1localhost:6379> expire foo 20 //设置生存时间,单位是秒,用命令pexpire,时间是毫秒(integer) 1localhost:6379> ttl foo //查看键foo还有多少时间(integer) 16localhost:6379> ttl foo(integer) 9localhost:6379> get foo"bar"localhost:6379> ttl foo(integer) 0localhost:6379> ttl foo //生存时间晚了,清空了键(integer) -2localhost:6379> get foo //这是查村返回nil(nil)取消键的生存时间的案例:localhost:6379> set foo barOKlocalhost:6379> expire foo 20(integer) 1localhost:6379> ttl foo(integer) 17localhost:6379> persist foo //取消键的生存时间(integer) 1localhost:6379> ttl foo(integer) -1


排序

Sort 命令列表排序案例:localhost:6379> lpush mylist 1 5 2 6 3 7 0(integer) 7localhost:6379> lrange mylist 0 -11) "0"2) "7"3) "3"4) "6"5) "2"6) "5"7) "1"localhost:6379> sort mylist //排序列表1) "0"2) "1"3) "2"4) "3"5) "5"6) "6"7) "7"有序集合排序:案例:localhost:6379> zadd myzset 10 a 80 b 90 c 20 d 40 e(integer) 5localhost:6379> sort myzset alpha //键是字母的排序1) "a"2) "b"3) "c"4) "d"5) "e"localhost:6379> zadd myzn 10 11 40 44 20 22 80 88 30 33 //键是数字的排序(integer) 5localhost:6379> sort myzn1) "11"2) "22"3) "33"4) "44"5) "88"

删除redis中所有的键

localhost:6379> flushdbOKlocalhost:6379> flushallOK
原创粉丝点击