基础知识
1)、测试redis服务的性能:redis-benchmark
2)、查看redis服务是否正常运行:
ping如果正常---pong..
3)、查看redis服务器的统计信息: info查看redis服务的所有统计信息 info [信息段]查看redis服务器的指定的统计信息,如: info Replication 4)、redis的数据库实例:作用类似于mysql的数据库实例,redis中的数据库实例只能由redis服务来创建和维护,开发人员不能修改和自行创建数据库实例;默认情况卞,redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从O开始,一直到15,使用时通过编号来使用数据库;可以通过配置文件,指定redis自动创建的数据库个数;redis的每一个数据库实例本身占用的存储空间是很少的,所以也不造成存储空间的太多浪费。默认情况下,redis客户端连接的是编号是0的数据库实例;可以使用select index切换数据库实例。
5)、查看当前数据库实例中所有key的数量: dbsize 6)、查看当前数据库实例中所有的key: keys * 7)、清空数据库实例:flushdb 8)、清空所有的数据库实例:flushall 9)、查看redis中所有的配置信息: config get * 查看redis中的指定的配置信息:config get parameter
五大数据结构
程序是用来处理数据的,存到数据库中
- 字符串(string):zhang 200 string 单key:单value username:zhangsan
- 列表(list):[17803499947 1767732958@qq.com 3123123] list 单key:多value(有序) contarst:178,123,123,543
- 集合(set):[北京 天津 上海 广州 ] set 单key:多value(无序) city: beij shangh tianj
- 哈希表 (字典)(hash): hash 单key:对象(属性:值) student:id1001,name:zha
- 有序集合(zset): zset 单key:多value(有序) city:2000 bj ,19999 sh
list和放的顺序有关系,zset和放的顺序无关,和参考值有关系
key值
- redis 中key 的操作命令
- keys pattern 满足通配符的命令
1、* 表示统配0-n个字符串 : keys * 查看redis所有的数据 keys k* 以k开头的数据
2、?表示对应一个字符 : keys k? 查看两个字符第一个是k的key值
3、[] 匹配[]中的一个字符 : keys h[abc]llo 以 h 开头 llo 结尾,并且中间字符是abc中的1个的key
- 判断是否存在某key exists
规则 操作命令 解释 判断是否存在某个key exists key 返回值:1存在0不存在 判断是否存在多个key exists key1 key2 … 返回值为存在key的数量 - 查看指定key的剩余生存时间 ttl
规则 操作命令 解释 查看指定key的剩余生存时间 ttl key 返回值:-2 key不存在,-1 未设置生存时间 - 设置key的最大生存时间 expire
规则 操作命令 解释 设置key的最大生存时间 expire key 20 时间单位为秒 如果不存在就返回0 - 查看key的数据类型 type
规则 操作命令 解释 查看key的数据类型 type key string/list - 重命名key rename
规则 操作命令 解释 重命名key rename key newKey - 删除key del
规则 操作命令 解释 删除key del key1 key2 … 返回值为删除key的数量 - 移动key到指定数据库 move
move k 1
string
- 将string保存到redis 中 set
如果存在,那么覆盖 srtnx 这个命令,如果key存在就不添加了
set key value - 获取string get
get key - 追加字符串 append key value
append ip 9999 返回追加之后的字符串的长度
如果key不存在就相当于set命令 - 获取key对应的value的长度 strlen key
返回value 的长度 - 将key中储存则数字值增1 incr key
如果key 不存在,那么先初始化key 为 0 然后incr 变成1 incr k1 v1 (k1 不存在) k1 1
如果key 存在但是是一个字符串,那么就报错 ERR value is not an integer or out of range - 将key中储存的数字值减1 decr key (基本同上)
- 将key中储存的数字值增增。自定义步长 incrby key 步长
- 将key中储存的数字值增减。自定义步长 decrby key 步长
decrby age 20 加20 so easy - 可以同时设置多组键值对 mset key1 value1 key2 value2 ........
mset k1 v1 k2 v2 k3 v3 mget k1 k2 k3 得: v1 v2 v3 - 可以同时一个或多个key的value值 mget key1 key2 key3 ....
- 同时设置多组键值对 msetnx key1 value1 key2 value2 .....
同时设置多组键值对,当且仅当所有给定的key都不存在时,才能设置成功原子性,有一个失败,则都失败 - 可以获取1个或多个键值对 mgetnx key1 key2 key3
- 子字符串操作
- setrange key 起始位置 字符串 初始hello 命令 setrange 3 asd 结果 helasd 把3后面得三个字符重写(覆盖子字符串)如果是空,就是起始位置之前的char用\x00来表示,新增一个key
- getrange key 起始位置(最小0) 结束位置(string.size()-1) 和数组一样 下标从0开始 getrange key 0 3 得:hela 闭区间截取 不影响redis得存储,只是单纯的取出来 下标可以是负数,和python差不多,最后一个字符是-1 ,然后自右向左,减一,-3 -1 就是取最后三个char
- setex key second value
设置时候指定存在时长 - getset key value
返回旧值,设置新值 相当于先get 然后set
前缀m表示批量 后缀ex 表示设置时长 nx 表示key不可以重复
list
- 下标和getreange 一样的,放入顺序是下标顺序,可以把 List 想象成一根管道。
- lpush (list push )
将一个或者多个值依次插入到列表的表头(列表的最左侧)
lpush key value1 value2 value3 value4 ........... 127.0.0.1:6379> lpush list1 beij tianj shangh $shangh 3 tianj 2 beij 1 (integer) 3 127.0.0.1:6379> keys * 1) "list1" - lrange
查看list内容 等于getrange
lrange key start stop (如果想看全部的就是0,-1) 127.0.0.1:6379> lrange list1 0 -1 1) "shangh" 2) "tianj" 3) "beij" 127.0.0.1:6379> - rpush
lpush 是在表头插入,rpush是在表尾插入 - lpop
左端删除,返回删除值 - rpop
右端删除,返回删除值 - del
全部删除 - llen
list 长度 - lindex
获取index 的值 lindex key index 127.0.0.1:6379> lpush list2 1 2 3 4 5 (integer) 5 127.0.0.1:6379> rpush list3 1 2 3 4 5 (integer) 5 127.0.0.1:6379> lrange list2 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> lrange list3 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> lpop list2 "5" 127.0.0.1:6379> lrange list2 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> rpop list3 "5" 127.0.0.1:6379> lrange list3 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> del list2 (integer) 1 127.0.0.1:6379> lrange list2 0 -1 (empty array) 127.0.0.1:6379> llen list3 (integer) 4 127.0.0.1:6379> lrange list3 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> lindex list3 2 "3" //这个下标应该是从0开始,上面显示的是从1开始 - lrem
lrem key count value
根据count 值移除指定列表中和value相等的数据:
count > 0 : 从列表左侧移除count个和value 相同的元素
count < 0 : 从列表右侧移除count个和value 相同的元素
count = 0 :从列表中删除和value相等的元素 127.0.0.1:6379> lpush list4 a a b c a d e a b b (integer) 10 127.0.0.1:6379> lrange list4 0 -1 1) "b" 2) "b" 3) "a" 4) "e" 5) "d" 6) "a" 7) "c" 8) "b" 9) "a" 10) "a" 127.0.0.1:6379> lrem list4 2 b (integer) 2 127.0.0.1:6379> lrange list4 0 -1 1) "a" 2) "e" 3) "d" 4) "a" 5) "c" 6) "b" 7) "a" 8) "a" 127.0.0.1:6379> lrem list4 1 a (integer) 1 127.0.0.1:6379> lrem list4 -2 a (integer) 2 127.0.0.1:6379> lrange list4 0 -1 1) "e" 2) "d" 3) "a" 4) "c" 5) "b" 127.0.0.1:6379>
最后,如果值全部移除,对应的键也就消失了。
set
- 无序但是不能重复,一个kye 对应多个value,无序而且不能重复 ,底层是底层是 HashTable
- 存放元素和读取元素
读取元素:smembers sismember scard srandmember 127.0.0.1:6379> sadd set1 a a b b c c (integer) 3 127.0.0.1:6379> smembers set1 1) "a" 2) "c" 3) "b" 127.0.0.1:6379> - 增删查
增加:sadd
删除:srem spop (spop key [count] 随机删除几个) smove() 127.0.0.1:6379> sadd set1 d #增加 (integer) 1 127.0.0.1:6379> smembers set1 1) "a" 2) "c" 3) "d" 4) "b" 127.0.0.1:6379> sismember set1 a #在不在集合中 (integer) 1 127.0.0.1:6379> sismember set1 e (integer) 0 127.0.0.1:6379> srem set1 a #删除 #不成功就被忽略 (integer) 1 127.0.0.1:6379> smembers set1 1) "c" 2) "d" 3) "b" 127.0.0.1:6379> scard set1 #有多少元素 (integer) 3 127.0.0.1:6379> srandmember set1 2 # 随机取count个数据 1) "c" 2) "b" 127.0.0.1:6379> spop set1 2 1) "d" 2) "b" 127.0.0.1:6379> smembers set1 1) "c" 127.0.0.1:6379> sadd set1 a b c d e f (integer) 5 127.0.0.1:6379> sadd set2 k (integer) 1 127.0.0.1:6379> smembers set1 1) "c" 2) "d" 3) "b" 4) "a" 5) "e" 6) "f" 127.0.0.1:6379> smembers set2 1) "k" 127.0.0.1:6379> smove set1 set2 a #smove source(源集合) destination(目标集合) member (integer) 1 127.0.0.1:6379> smembers set1 1) "d" 2) "b" 3) "c" 4) "e" 5) "f" 127.0.0.1:6379> smembers set2 1) "a" 2) "k" - 集合的交并差运算
交集:
sinter key1 key2 key3 ..... 找到这几个集合中的相同元素
sinterstore destination key1 key2 key3 ..... 找到的元素存储起来
并集:
sunion key1 key2 key3 找到这几个集合的全部元素
sunionstore destination key1 key2 key3 存储起来
差集:
sdiff 获取一个集合中有,但是其他集合没有的元素组成一个新集合
sdiff key1 key2 key3 (集合key1 中有但是key2 key3 中没有)
sdiffstore destination key1 key2 key3 存储到destination #交集 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> sadd set1 a b c d e f (integer) 6 127.0.0.1:6379> sadd set2 a b c (integer) 3 127.0.0.1:6379> sadd set3 c d e f (integer) 4 127.0.0.1:6379> sinter set1 set2 set3 1) "c" 127.0.0.1:6379> sinter set4 set1 set2 set3 (empty array) 127.0.0.1:6379> sinterstore set4 set1 set2 set3 (integer) 1 127.0.0.1:6379> smembers set4 1) "c" #并集 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> sadd set1 a b c (integer) 3 127.0.0.1:6379> sadd set2 a b d (integer) 3 127.0.0.1:6379> sadd set3 c d e (integer) 3 127.0.0.1:6379> sunion set1 set2 set3 1) "c" 2) "b" 3) "d" 4) "a" 5) "e" 127.0.0.1:6379> sunionstore set4 set1 set2 set3 (integer) 5 127.0.0.1:6379> smembers set4 1) "c" 2) "b" 3) "d" 4) "a" 5) "e" #差集 127.0.0.1:6379> sadd set3 a b c d e f (integer) 6 127.0.0.1:6379> sadd set4 a b c (integer) 3 127.0.0.1:6379> add set5 d e ad (error) ERR unknown command `add`, with args beginning with: `set5`, `d`, `e`, `ad`, 127.0.0.1:6379> sadd set5 d e ad (integer) 3 127.0.0.1:6379> sdiff set3 set4 set5 #不存储 1) "f" 127.0.0.1:6379> sdiffstore set6 set3 set4 set5 #存储 (integer) 1 127.0.0.1:6379> smembers set6 1) "f"
hash
- 单key : field -vaule field -vaule field -vaule field -vaule field -vaule field -vaule (多个)
Redis [hash] 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。 - 存取数据
存取:
hset key field1 value1 [field1 value1]
hmset key field1 value1 [field1 value1] (其实一样的,没鸡毛差距)
hsetnx key field value 如果field-value 不存在,就设置(返回1),存在,放弃设置(没有例子,返回0)
获取:
hgetall key
hget key field
hmget key field [field.....]
进阶版获取(没有这个名词):
hlen key
hkeys key
hvals key
删除:
hdel key field [field......]
存在:
hexists key field 存在1 不存在0
增加:
hincrby key field int
hincrbyfloat key field float 127.0.0.1:6379> flushall OK 127.0.0.1:6379> hset hash1 name zhangsan age 20 sex nan (integer) 3 127.0.0.1:6379> hget hash1 name "zhangsan" 127.0.0.1:6379> hget hash1 age "20" 127.0.0.1:6379> hget hash1 sex "nan" 127.0.0.1:6379> hmget hash1 age sex 1) "20" 2) "nan" 127.0.0.1:6379> hgetall hash1 1) "name" 2) "zhangsan" 3) "age" 4) "20" 5) "sex" 6) "nan" 127.0.0.1:6379> hlen hash1 (integer) 3 127.0.0.1:6379> hkeys hash1 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hvals hash1 1) "zhangsan" 2) "20" 3) "nan" 127.0.0.1:6379> hdel hash1 name (integer) 1 127.0.0.1:6379> hkeys hash1 1) "age" 2) "sex" 127.0.0.1:6379> hexists hash1 age (integer) 1 127.0.0.1:6379> hexists hash1 name (integer) 0 127.0.0.1:6379> hget hash1 age "20" 127.0.0.1:6379> hincrby hash1 age 4 (integer) 24 127.0.0.1:6379> hget hash1 age "24" 127.0.0.1:6379> hincrbyfloat hash1 age 0.5 "24.5" 127.0.0.1:6379> hget hash1 age "24.5"
zset
zset 通常包含 3 个 关键字操作:
- key (与我们 redis 通常操作的 key value 中的key 一致)
- score (排序的分数,该分数是有序集合的关键,可以是双精度或者是整数)
- member (指我们传入的 obj,与 key value 中的 value 一致)
每个元素的分数可以重合,但是元素不能重合(本质上就是set)
- 存取数据(从小到大加了rev就是从大到小)
- 添加数据
- zadd key score member [score member] (score是数值类型)
- 获取元素
- 根据指令下标 zrange key startindex stopindex [withscores]
- 根据分数区间 zrangebyscore key minscore maxscore [withscores]
- 删除元素
- zrem key member [member]
- 获取member个数
- zcard key
- 获取指定元素的排名
- zrank key member (其实返回的是下标,排名从0开始的!!!)(从小到大)
- zrevrank key member (从大到小,排名从0开始 !)
- 某个分数区间的个数
- zcount key minscore maxscore
- 指定元素查分数
- zscore key member
127.0.0.1:6379> zadd zset 20 zhangsan 21 lisi 22 wangwu
(integer) 3
127.0.0.1:6379> zrange zset 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zadd zset 19 zhaoliu
(integer) 1
127.0.0.1:6379> zrange zset 0 -1 #按照分数排序
1) "zhaoliu"
2) "zhangsan"
3) "lisi"
4) "wangwu"
127.0.0.1:6379> zadd zset 23 zhaoliu
(integer) 0
127.0.0.1:6379> zrange zset 0 -1
1) "zhangsan"
2) "lisi"
3) "wangwu"
4) "zhaoliu" #zhaoliu的score改变了
127.0.0.1:6379> zrangebyscore zset 22 23 ##根据score来查询
1) "wangwu"
2) "zhaoliu"
127.0.0.1:6379> zrangebyscore zset 22 23 WITHSCORES #带上score
1) "wangwu"
2) "22"
3) "zhaoliu"
4) "23"
127.0.0.1:6379> zcard zset #查看有多少个元素
(integer) 4
127.0.0.1:6379> zrank zset lisi
(integer) 1
127.0.0.1:6379> zcount zset 21 23
(integer) 3
127.0.0.1:6379> ZSCORE zset zhaoliu
"23"