Redis是开源的,c编写的,基于内存(快)且支持持久化(数据备份保存到硬盘),高性能的key-value的NoSQL数据库
目录
1、字符串String
2、列表List(有索引)
3、散列 Hash (实际上是map)
4、集合 Set(去重,无序)
5、有序集合 sortedSet (去重,有序)
Linux连接Redis
cd /usr/local/soft/redis/bin (必须在该目录下启动)
1、启动前需杀死服务(redis server)
# ps -aux|grep redis
# kill -9 端口号
2、启动服务
方式一:另打开一个窗口
[root@master bin]# redis-server
方式二:后台启动(生成一个日志文件nohup.out)
[root@master bin]# nohup redis-server redis.conf&
3、启动完,连接redis
# redis-cli
Redis数据模型
键key
任何二进制序列都可作为k值(如空字符串,JPEG文件)
k取值原则(1.不需要太长,消耗内存 2.不宜过短,可读性差)
存取单个
set k v
get k
存取多个(原子性:要插入都插入,要失败都失败)
mset k1 v1 k2 v2
mget k1 k2
生存时间TTL(针对redis中的k,不可对散列中的字段k操作)
k曾经存在,但已消亡 -2
k存在,但在生存期内 返回剩余秒/毫秒
k存在,但未设置TTL -1
设置TTL
创建时:
set k v EX 5 (EX:设置过期时间5秒,PX:设置过期时间毫秒)
创建后:
expire k 5 (k5秒过期)
pexpire k 5 (k5毫秒过期)
expireat k 时间戳
pexpireat k 时间戳
persist k (删除过期)
针对建的操作
keys * (查找所有键)
keys ? (查找一个字母的键)
keys ?? (查找两个字母的键)
type k (键类型)
del k (删除键,del *删不掉,*会识别成二进制序列的k)
1、字符串String
set str 123456789abc
strlen str (获取长度)
append str def (字符串后追加def)
append s 123 (s不存在,等同于set s 123)
getrange str 0 2 "123" (获取子字符串)
-3 -1 "def"
开始 结束
原123456789abc
setrange str 5 1234 (覆盖子字符串)
现123451234abc
步长
set k 10 (v是int类型)
步长1的增减
incr k 11
decr k 10
步长增减
incrby k 20 30
incrby k -20 10
位图bitmap
String默认隐藏一个位图,位图不是正真的数据类型,位图就是由很多个bit位连续组成的一个列表或一个集合,无论有无数据,位置都在那,默认位置全部为0,且redis认为0不是数据
set k a
getbit k 0
getbit k 1
...
getbit k 7
0 1 1 0 0 0 0 1 —— a
0 1 1 0 0 0 1 0 —— b
setbit k 6 1 (把6的位置改为1)
setbit k 7 0 (把7的位置改为0)
get k “b”
返回0或1 在指定区间上第一次出现的位置
bitpos k 0 0 7 0
开始 结束
bitpos k 1 0 7 1
位操作
0 1 1 0 0 0 0 1 —— a
0 1 1 0 0 0 1 0 —— b
bitop and aandb a b
结果保存到
and并(都为1才为1)
0 1 1 0 0 0 0 0 —— aandb
bitop or aorb a b
or或(有1则1)
0 1 1 0 0 0 1 1 —— aorb
bitop xor axorb a b
xor异或(相同为0,不同为1)
0 0 0 0 0 0 1 1 —— axorb
bitop not nota a
not非
1 0 0 1 1 1 1 0 —— nota
统计指定位区间上值1的个数
bitcount key [start] [end] (没指定区间,则查找所有)
(不是按元素的索引,而是按8个bit形成的一块区域当作一个区间)
set k aaaa
bitcount k 0 3 12
bitcount k 0 1 6
2、列表List(有索引)
左(上)右(下)压入元素
lpush l java
rpush l python
左右弹出元素(弹出后,原数据中就没有了)
lpop l "java"
返回列表指定范围元素
lrange l 0 1
开始 结束
lrange l 0 -1 (表示返回列表所有元素)
获取指定位置元素
llindex l 0
设置指定位置元素的值
lset l 2 python
获取列表长度
llen l
从列表头部开始删除值为value的元素count次
lrem l count value (count>0,从上往下删;count<0,从下往上删)
去除指定范围外的元素
ltrim l 1 2
开始 结束
阻塞(弹值用)
blpop ll 10 (阻塞10秒)
blpop ll 0 (给0表示永久阻塞,直到有值弹出) lpush ll java
3、散列 Hash (实际上是map)
redis本质上是k:v,现在v变成map,k:[k:v]
设置字段(单个/多个)
hset stu id 1001
hset stu name zs
hmset stu id 1001 name zs
hget stu id "1001"
hmget stu id name "1001" "zs"
返回字段个数
hlen stu
判断字段是否存在
hexists stu id (存在返回1)
hexists stu clazz (不存在返回0)
存储易混淆字段
返回所有键值对
hgetall stu
返回所有字段名
hkeys stu
返回所有值
hvals stu
删除指定字段
hdel stu id
hash用途
节约内存空间,对于存储多个字段的信息选择hash
4、集合 Set(去重,无序)
增加一个或多个元素(自动去重)
sadd s java hadoop python
移除一个或多个元素(元素不存在则自动忽略)
srem s java pyhthon
返回集合包含的所有元素
smembers s
检查给定元素是否存在于集合中
sismember s java (有返回1,没有返回0)
随机返回集合中指定个数的元素
srandmember s count (count为正数,返回元素各不相同;
count为负数,返回元素可能出现重复)
返回集合中元素个数
scard s
随机移除集合中某个元素,并显示
spop s
对集合的操作
sadd s1 1 2 3 4 5 6
sadd s2 4 5 6 7 8 9
差集
sdiffstore s3 s1 s2
smembers s3 123
交集
sinterstore s4 s1 s2
smembers s4 456
并集
sunionstore s5 s1 s2
smembers s5 1234567899
5、有序集合 sortedSet (去重,有序)
应用场景:音乐打榜
每个元素都关联一个浮点数分值(sore),按分值从小到大排列,分值可相同
添加元素(一个或多个)
zadd z 1.0 a 2.0 b 3.0 c (若元素已存在,则使用新的分值。
分值相同,转化为二进制排序;分值不能精确表达,只能近似)
移除元素(一个或多个)
zrem z a c
加减分值
zincrby z 5 a (a的分值加5)
zincrby z -5 a (a的分值减5)
返回元素排名(索引)
zrank z a (返回元素a的排名)
返回指定索引区间元素
zrange z 0 1
返回指定分值区间元素
zrangebyscore z 1 5
移除指定排名范围的元素
zremrangebyrank z 0 1
返回集合中元素个数
zcard z
对集合的操作
zadd za 10 a 20 b
zadd zb 12 a 20 c
aggregate:指定并集结果的聚合方式
并集
分值默认相加
其他操作
库与库之间的切换
select 1
select 2
清空
flushdb (清空当前库)
flushall (清空所有库中数据)