redis笔记
redis几大基本类型
基础语法
set key1 v1 设置值
get key1 取值
keys * 获得所有的key
exists key1 判断key是否存在
append key1 hello 追加字符串,如果key不存在,相当于set key
strlen key1 获得字符串长度
incr key1 加一
decr key1 减一
incrby key1 10 加10
decrby key1 10 减10
flushdb 清空当前库数据
getrange key1 0 3 截取0到3的字符串
setrange key2 1 hh 把下标为1的字符替换成 hh
setex key3 30 "hello" 设置30秒过期并把值设置为hello
ttl key3 查看还有多少过期
setnx key3 "hah" 不存在才能设置,存在设置无效
mset k1 v1 k2 v2 k3 v3 k4 v4 批量设置值
mget k1 k2 k3 k4 批量取值
msetnx k1 v1 k5 v5 如果这些key都不存在,则批量赋值,是一个原子性操作
mset user:1:name shangsan user:1:age 2 把user1的name赋值为zhangsan,user1的age为2
mget user:1:name 取出user1的name的值
127.0.0.1:6379> getset db redis 如果不存在db的值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb 如果存在值,则设置新的值,返回当前值 getset就是先取值在存值
"redis"
127.0.0.1:6379> get db
"mongodb"
config set requirepass 123456 设置redis密码
auth 123456 用密码登录
string类型
incr key1 加一
decr key1 减一
incrby key1 10 加10
decrby key1 10 减10
flushdb 清空当前库数据
getrange key1 0 3 截取0到3的字符串
setrange key2 1 hh 把下标为1的字符替换成 hh
setex key3 30 "hello" 设置30秒过期并把值设置为hello
ttl key3 查看还有多少过期
setnx key3 "hah" 不存在才能设置,存在设置无效
mset k1 v1 k2 v2 k3 v3 k4 v4 批量设置值
mget k1 k2 k3 k4 批量取值
msetnx k1 v1 k5 v5 如果这些key都不存在,则批量赋值,是一个原子性操作
mset user:1:name shangsan user:1:age 2 把user1的name赋值为zhangsan,user1的age为2
mget user:1:name 取出user1的name的值
127.0.0.1:6379> getset db redis 如果不存在db的值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb 如果存在值,则设置新的值,返回当前值 getset就是先取值在存值
"redis"
127.0.0.1:6379> get db
"mongodb"
list类型
127.0.0.1:6379> lpush list one l表示left,将一个值或者多个值插入列表头部
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lrange list 0 1
1) "two"
2) "one"
127.0.0.1:6379> lrange list 0 0
1) "two"
127.0.0.1:6379> rpush list right r表示right,将一个值插入到最后
lpop list 移除头部,也就是列表第一个元素
rpop list 移除尾部,也就是最后一个元素
lindex list 0 通过下标获得list下的某一个值
llen list 返回list的长度
lrem list 2 three 删除内容为three的list里的元素并且只删除两个
ltrim list 1 2 截取list下标为1,2的两个值
rpoplpush list mylist 移除list的最后一个元素放入mylist的头部
lset list 0 haha 把list的第0个元素替换成haha
linsert list before "world" "haha" 在world之前插入haha
linsert list after "world" "xixi" 在world后面插入xixi
set 类型
set中不能有重复值
sadd set hello 在set中添加hello
smembers set 查看set中的元素
sismember set hello 是否存在hello
scard set 查看set有几个元素
srem set hello 删除hello
srandmember set 在set里面随机取出一个元素
spop set 随机删除一个元素
smove set set2 hello 把set里面的hello放到set2头部
sdiff set1 set2 取出set1有set2没有的元素
sinter set1 set2 取出set1和set2的交集
sunion set1 set2 取出set1和set2的并集
map类型
hset hash key1 xiaojie 添加一个hash的key为key1,value为xiaojie
hget hash key1 获得hash里面的key1的value
hmset hash key2 haha key3 xixi 批量插入
hmget hash key2 key3 批量获取
hgetall hash 获得hash的所有值
hdel hash key1 删除hash中的key1
hlen hash 获得hash的长度
hexists hash key2 判断hash的key2是否存在
hkeys hash 获取hash所有的key
hvals hash 获取hash所有的value
hincrby hash key3 1 使得key3加一
hincrby hash key3 -1 减一
hsetnx hash key2 haha 如果有值则不能赋值,没有值才赋值为haha
zset类型
zadd set 1 one 添加一个one,标记为1
zrange set 0 -1 获取所有元素
zadd salary 2500 xiaohong 5000 zhangsan 500 xiaojie 给小红张三小杰各发了工资,进行排序,利用标志
zrangebyscore salary -inf +inf 用工资排序,从小到大,-inf为-&,+inf为+&
zrangebyscore salary -inf +inf withscores 排序并且显示工资
zrangebyscore salary -inf 2500 withscores 在-&到2500工资以内的进行排序显示出来
zrem salary xiaohong 移除小红
zcard salary 查看长度
zrevrange salary 0 -1 从大到小排序薪水
zcount set 1 2 查看区间里面的成员数量
redis三大特殊类型
bitmaps
记录周一到周日的打卡
周一:1 ;周二:0 ............................
127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3 查看周四是否打卡
(integer) 1
127.0.0.1:6379> bitcount sign 查看一周打卡了多少天
(integer) 3
geoaptial
geoadd china:city 116.40 39.90 beijin 添加一个中国的城市北京,经纬度为116.4,39.9
geopos china:city beijin chongqing 获得北京和重庆的经纬度
geodist china:city beijin shanghai 获得北京到上海的距离
georadius china:city 100 30 1000 km 在以经纬度100,30为中心,方圆1000km有多少城市
georadius china:city 100 30 1000 km withcoord 查询并且显示经纬度
georadius china:city 100 30 1000 km withdist withcoord count 2 查询并且只显示两个城市
georadiusbymember china:city beijin 1000 km 以北京为中心1000km有多少城市
127.0.0.1:6379> geohash china:city beijin chongqing 将二维的经纬度表示成一维的字符串
1) "wx4fbxxfke0"
2) "wm5xzrybty0"
zrange china:city 0 -1 查看所有城市,具体查删除可参考zset
Hyperloglog
pfadd set a b c d e f i g h i j 添加元素
pfcount set 查看不重复元素个数
pfmerge set3 set set2 把set和set2合并到set3里且不允许有重复的
redis乐观锁
很乐观,认为什么时候都不会出现问题,所以不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money 监视钱,乐观锁
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRBY money 10
QUEUED
127.0.0.1:6379> INCRBY out 10
QUEUED
127.0.0.1:6379> exec
(nil) 修改失败,因为用第二个线程改了money的值
然后解锁unwatch
在加锁 watch money
在操作