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 jiang OK redis 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' OK redis 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) 2 redis 127.0.0.1:6379> get cao (nil)返回键的值的数据类型
redis 127.0.0.1:6379> set cao 'aaaa' OK redis 127.0.0.1:6379> type cao string注:一个字符串类型的键最大存储数据的容量是512MB
递增数字: 字符串类型可以存储任何形式的字符串,当存储的字符串是以整数形式时,redis提供一个命令INCR,其作用是让当前值递增 命令:INCR key
redis 127.0.0.1:6379> incr i (integer) 1 redis 127.0.0.1:6379> incr i (integer) 2 redis 127.0.0.1:6379> get i "2" redis 127.0.0.1:6379> type i string redis 127.0.0.1:6379> set j 1 OK redis 127.0.0.1:6379> incr j (integer) 2 redis 127.0.0.1:6379> get j "2" //incrby 指定一次增加的数值 redis 127.0.0.1:6379> incrby j 4 (integer) 6 redis 127.0.0.1:6379> get j "6" //decr 递减数值 redis 127.0.0.1:6379> decr j (integer) 5 redis 127.0.0.1:6379> get j "5" //指定减少的数值 redis 127.0.0.1:6379> decrby j 3 (integer) 2 redis 127.0.0.1:6379> get j "2" redis 127.0.0.1:6379> //向字符串尾部追加字符 redis 127.0.0.1:6379> APPEND j 'a' (integer) 2 redis 127.0.0.1:6379> get j "2a" //获取字符串的长度 redis 127.0.0.1:6379> strlen j (integer) 2 redis 127.0.0.1:6379> set j '哪汉' OK redis 127.0.0.1:6379> strlen j (integer) 4 //同时设置多个键值 redis 127.0.0.1:6379> mset k1 'a' k2 'b' k3 c OK redis 127.0.0.1:6379> get k3 "c" //同时获取多个键值 redis 127.0.0.1:6379> mget k1 k3 1) "a" 2) "c"位操作:(redis提供了几个命令直接对二进制位进行操作) ASCII中A对应十进制65,一次往后推,a对应97
redis 127.0.0.1:6379> set foo bar OK //getbit获取指定位置上的二进制数值 redis 127.0.0.1:6379> getbit foo 0 (integer) 0 redis 127.0.0.1:6379> getbit foo 1 (integer) 1 redis 127.0.0.1:6379> getbit foo 2 (integer) 1 redis 127.0.0.1:6379> getbit foo 3 (integer) 0 redis 127.0.0.1:6379> getbit foo 4 (integer) 0 redis 127.0.0.1:6379> getbit foo 5 (integer) 0 redis 127.0.0.1:6379> getbit foo 6 (integer) 1 redis 127.0.0.1:6379> getbit foo 7 (integer) 0 redis 127.0.0.1:6379> getbit foo 8 (integer) 0 redis 127.0.0.1:6379> getbit foo 9 (integer) 1 redis 127.0.0.1:6379> getbit foo 10 (integer) 1 redis 127.0.0.1:6379> getbit foo 11 (integer) 0 redis 127.0.0.1:6379> getbit foo 12 (integer) 0 redis 127.0.0.1:6379> getbit foo 13 (integer) 0 redis 127.0.0.1:6379> getbit foo 14 (integer) 0 redis 127.0.0.1:6379> getbit foo 15 (integer) 1 redis 127.0.0.1:6379> getbit foo 16 (integer) 0 redis 127.0.0.1:6379> getbit foo 17 (integer) 1 redis 127.0.0.1:6379> getbit foo 18 (integer) 1 redis 127.0.0.1:6379> getbit foo 19 (integer) 1 redis 127.0.0.1:6379> getbit foo 20 (integer) 0 redis 127.0.0.1:6379> getbit foo 21 (integer) 0 redis 127.0.0.1:6379> getbit foo 22 (integer) 1 redis 127.0.0.1:6379> getbit foo 23 (integer) 0 //超过了foo,23位以后都显示0 redis 127.0.0.1:6379> getbit foo 24 (integer) 0更改对应位置上的二进制
redis 127.0.0.1:6379> setbit foo 6 0 (integer) 1 redis 127.0.0.1:6379> setbit foo 7 1 (integer) 0 redis 127.0.0.1:6379> get foo "aar" //当setbit设置的位数操作变量的位数,会将对应的8为自动补0 redis 127.0.0.1:6379> set foo bar OK //设置25位为1后,24-31位除25位以外其余都是0 redis 127.0.0.1:6379> setbit foo 25 1 (integer) 0 redis 127.0.0.1:6379> setbit foo 26 1 (integer) 0 redis 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 bar OK 127.0.0.1:6379> SET foo2 aar OK 127.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) 3 127.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) 6 127.0.0.1:6379> bitcount foo1 0 0 (integer) 3 127.0.0.1:6379> bitcount foo1 0 1 (integer) 6 127.0.0.1:6379> bitcount foo1 0 2 (integer) 10 127.0.0.1:6379> bitcount foo1 1 2 (integer) 7 127.0.0.1:6379> bitcount foo1 2 2 (integer) 42.散列类型: 散列类型一个键对应多个字段,每个字段对应一个字段值。 注:字段值只能是字符串类型,故不能嵌套
//键位car,字段为price,字段值500 127.0.0.1:6379> hset car price 500 (integer) 0 127.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 2 OK //获取多个字段值 127.0.0.1:6379> hmget car id name price 1) "1" 2) "HWM" 3) "500" //获取所有的字段和其对应的字段值 127.0.0.1:6379> hgetall car 1) "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) 0 127.0.0.1:6379> hget car name "HWM" 127.0.0.1:6379> hsetnx car qq 11122 (integer) 1 127.0.0.1:6379> hget car qq "11122" //字段值增加对应的数 127.0.0.1:6379> hincrby car id 2//将id加上2 (integer) 3 127.0.0.1:6379> hget car id "3" //删除字段 127.0.0.1:6379> hdel car id (integer) 1 127.0.0.1:6379> hget car id (nil) //只获取对应键的字段名 127.0.0.1:6379> hkeys car 1) "price" 2) "name" 3) "yy" 4) "qq" //只获取对应键的字段值 127.0.0.1:6379> hvals car 1) "500" 2) "HWM" 3) "2" 4) "11122" //获取对应键的字段数量 127.0.0.1:6379> hlen car (integer) 43.列表类型
//向列表numbers的左边添加元素1 127.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 -1 1) "0" 127.0.0.1:6379> lrange numbers -2 -2 1) "1" 127.0.0.1:6379> lrange numbers -3 -3 1) "2" //从列表的左边开始删除列表中指定的值 语法: lrem key count value count > 0 : 从列表的左边开始删除前count个值为values的元素 count < 0 : 从列表的右边开始删除前|count|个值为values的元素 count = 0 : 删除列表中所有值为value的元素 127.0.0.1:6379> lrange numbers 0 100 1) "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) 1 127.0.0.1:6379> lrange numbers 0 100 1) "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’ OK 127.0.0.1:6379> lindex numbers 0 "33" //只保留指定片段 127.0.0.1:6379> ltrim numbers 0 4//只保留索引为0到4的元素 OK 127.0.0.1:6379> lrange numbers 0 100 1) "33" 2) "1" 3) "2" 4) "1" 5) "0" //在指定的值后面插入元素 语法: linsert key before/after privot value 从列表的左边开始查找,找到值为privot对应的元素,在看设置的是before还是after,插入value。 127.0.0.1:6379> lrange numbers 0 100 1) "33" 2) "1" 3) "2" 4) "1" 5) "0" 127.0.0.1:6379> linsert numbers after 1 -1//从列表的左边开始找,找到值为1的元素后边插入-1 (integer) 6 127.0.0.1:6379> lrange numbers 0 100 1) "33" 2) "1" 3) "-1" 4) "2" 5) "1" 6) "0"4.集合类型: 集合当中不会有形同的元素
//向集合letters添加元素a 127.0.0.1:6379> sadd letters a (integer) 1 //查看集合中所有的元素 127.0.0.1:6379> smembers letters 1) "a" //因为集合中已经存在a,所以不会再添加a 127.0.0.1:6379> sadd letters a b c (integer) 2 127.0.0.1:6379> smembers letters 1) "c" 2) "b" 3) "a" //删除集合中的元素 127.0.0.1:6379> srem letters c d (integer) 1//d不再集合当中,故返回1 127.0.0.1:6379> smembers letters 1) "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) 3 127.0.0.1:6379> sadd setb 2 3 5 (integer) 3 127.0.0.1:6379> sdiff seta setb 1) "1"交集:sinter
127.0.0.1:6379> sadd seta 1 2 3 (integer) 3 127.0.0.1:6379> sadd setb 2 3 5 (integer) 3 127.0.0.1:6379> sinter seta setb 1) "2" 2) "3"并集:sunion
127.0.0.1:6379> sadd seta 1 2 3 (integer) 3 127.0.0.1:6379> sadd setb 2 3 5 (integer) 3 127.0.0.1:6379> sunion seta setb 1) "1" 2) "2" 3) "3" 4) "5"将上面集合运算存入到键当中,而不是显示
127.0.0.1:6379> sdiffstore cc seta setb (integer) 1 127.0.0.1:6379> smembers cc 1) "1" 127.0.0.1:6379> sinterstore dd seta setb (integer) 2 127.0.0.1:6379> smembers dd 1) "2" 2) "3" 127.0.0.1:6379> sunionstore ee seta setb (integer) 4 127.0.0.1:6379> smembers ee 1) "1"得到集合当中元素的个数
127.0.0.1:6379> smembers letters 1) "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 2 1) "5" 2) "1" 127.0.0.1:6379> srandmember ee 2 1) "2" 2) "1"从集合当中弹出元素
127.0.0.1:6379> smembers ee 1) "1" 2) "2" 3) "3" 4) "5" 127.0.0.1:6379> spop ee//默认弹出元素的个数为1 "3" 127.0.0.1:6379> smembers ee 1) "1" 2) "2" 3) "5" 127.0.0.1:6379> spop ee 2//设置弹出元素的个数 1) "1" 2) "2" 127.0.0.1:6379> smembers ee 1) "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) 0 127.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) 0 127.0.0.1:6379> zrangebyscore scoreboard 80 100//大于等于80小于等于100 1) "tom" 2) "david" 127.0.0.1:6379> zrangebyscore scoreboard 80 (100 //大于等于80小于100 1) "tom" 127.0.0.1:6379> zrangebyscore scoreboard (89 +inf //大于89,不包含89 1) "david" 127.0.0.1:6379> zrangebyscore scoreboard 89 +inf //大于等于89 1) "tom" 2) "david" //遍历集合当中所有的元素 127.0.0.1:6379> zrange scoreboard 0 -1 1) "peter" 2) "tom" 3) "david" 127.0.0.1:6379> zrange scoreboard 0 -1 withscores 1) "peter" 2) "67" 3) "tom" 4) "89" 5) "david" 6) "100" 127.0.0.1:6379> zrangebyscore scoreboard 60 +inf limit 1 2 1) "tom" 2) "david" 有上面我们知道peter,tom,david都大于60 zrangebyscore 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) 1 127.0.0.1:6379> zrange scoreboard 0 -1 1) "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) 3 127.0.0.1:6379> zrange scoreboard 0 -1 1) "gg" 2) "tom" 3) "tt" 4) "david" //按照元素值得范围删除 127.0.0.1:6379> zremrangebyscore scoreboard 0 90 (integer) 2 127.0.0.1:6379> zrange scoreboard 0 -1 1) "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> multi OK localhost:6379> sadd "user:1:following" 2 QUEUED localhost:6379> sadd "user:2:followers" 1 QUEUED localhost:6379> exec 1) (integer) 1 2) (integer) 1如果客户端在命令exec之前掉线了,redis就会清空任务队列,所有命名都不会执行。 如果客户端在发送命令exec之后掉线,所有的命令也都会执行。
事务的错误处理 1.语法错误: 案例
localhost:6379> set aas dd QUEUED localhost:6379> set aas (error) ERR wrong number of arguments for 'set' command localhost: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> multi OK localhost:6379> set qa 1 QUEUED localhost:6379> sadd qa 2 QUEUED localhost:6379> set qa 3 QUEUED localhost:6379> exec 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK localhost:6379> get qa "3"可见虽然第二条命令(add qa 2)出错了,但是第三条命令依然执行了,redis没有提供回滚的功能,这便要开发者自己在执行错误后,自己处理。
命令watch:用于监控一个或多个键,一旦其中有一个键被修改或删除,之后的事物就不会执行,直到执行到exec命令之后才会执行。
案例
localhost:6379> set key 1 OK localhost:6379> watch key OK localhost:6379> set key 2 OK localhost:6379> get key "2" localhost:6379> multi OK localhost:6379> set key 3 QUEUED localhost:6379> exec (nil) localhost:6379> get key "2" localhost:6379> set key 4 OK localhost:6379> get key "4"键的生成时间: 案例:
localhost:6379> set foo bar OK localhost:6379> ttl foo // 查看键还剩多少时间,没有设置时间的返回-1 (integer) -1 localhost:6379> expire foo 20 //设置生存时间,单位是秒,用命令pexpire,时间是毫秒 (integer) 1 localhost:6379> ttl foo //查看键foo还有多少时间 (integer) 16 localhost:6379> ttl foo (integer) 9 localhost:6379> get foo "bar" localhost:6379> ttl foo (integer) 0 localhost:6379> ttl foo //生存时间晚了,清空了键 (integer) -2 localhost:6379> get foo //这是查村返回nil (nil) 取消键的生存时间的案例: localhost:6379> set foo bar OK localhost:6379> expire foo 20 (integer) 1 localhost:6379> ttl foo (integer) 17 localhost:6379> persist foo //取消键的生存时间 (integer) 1 localhost:6379> ttl foo (integer) -1排序
Sort 命令 列表排序案例: localhost:6379> lpush mylist 1 5 2 6 3 7 0 (integer) 7 localhost:6379> lrange mylist 0 -1 1) "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) 5 localhost: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) 5 localhost:6379> sort myzn 1) "11" 2) "22" 3) "33" 4) "44" 5) "88"删除redis中所有的键
localhost:6379> flushdb OK localhost:6379> flushall OK