redis详解

184 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、redis是什么?

redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。也被称之为结构化数据库

2、redis能干什么?

1、内存存储,持久化,内存中断电即失,所以持久化很重要

2、效率高,可以用于高速缓存

3、发布订阅系统,地图信息分析,计时器,计数器等等

3、Linux基本redis命令

Redis默认安装路径

/usr/local/bin
启动Redis

redis -server kconfig/redis.conf
测试连接

redis-cli -p 6379
查看Redis进程是否开启

ps -ef|grep redis
如何关闭Redis服务

shutdown
查看所有key

keys *
确定某个key是否存在

EXISTS key
移除某个key

del key
从某个数据库移除
del key index
进行数据库切换

redis默认有16个数据库,默认使用的是第0select index
​
dbsize 查看数据库大小
清空当前库

flushdb
清空所有库

flushall
设置key的过期时间

EXPIRE key 时间
查看当前key的剩余时间

ttl key
判断当前key的数据类型

type key

4、Redis五大数据类型

1. String

1:往String类型数据后面追字符串,如果当前key不存在就相当于set key
append key "字符串"
2:获取mougekey的长度
strlen key
3:自增 自减
incr key (自增1)
decr key (自减1)
incrby key number 设置步长指定增量
decrby key number 设置步长减去指定增量
4:获取字符串的范围(截取字符串)
getrange key start end
getrange key 0 -1(查看全部字符串)
5:替换字符串
setrange key start "XX替换的内容"
6:setex key second valueset with expire)设置过期时间,如果存在直接覆盖,再设置过期时间,不存在先新增再设置过期时间;setnx key valueset if not exist)
不存在再设置,存在则不设置(不覆盖原有值),在分布式锁中常常使用。
7:批量获取值和设置值
mset k1 v1 k2 v2 k3 v3.....
mget k1 k2 k3 k4
msetnx k1 v1 k2 v2(不存在再设置,存在就不设置)(原子性操作,要么一起成功,要么一起失败)
8:
mset user:1:name zhangsan user:1:age 12
mget user:1 name user:1:age
9:
getset key valuegetset;如果不存在返回null,然后set会自动创建key;如果存在,返回已存在的key,然后set会替换掉已存在的值

2. List

1:存值
lpush key value
2:按范围取值
lrange key start stop
3:往尾部(右边)添加值
rpush key value
4:移除列表第一个元素,或最后一个元素(移除左,右的值)
rpop key
5:按下标取值
lindex key index
6:查看list长度
llen key
7:移除指定值
lrem key count value
8:通过下标截取指定长度
ltrim key start stop
9:移除某个列表最后一个值((source是某个列表的key)),添加到新列表中(destination是新列表的key)
rpoplpush source destination
10:按指定下标替换值,不存在的key或者index会报错
lset key index value
11:往指定key的指定value(pivot)前或者后添加指定值
linsert key BEFORE|AFTER pivot value

3. Set

1:按key存值
sadd key member
2:查看指定key的所有值
smembers key
3:判断某个key中是否包含某值
sismember key member
4:获取key中元素的个数
scard key
5:移除key中的指定值
srem key member
6:随机取key中的值
(count是取出随机值的个数,不指定个数,随机抽出一个值)
srandmember key [count]
7:随机删除元素
spop key [count]
8:将一个指定值,移到另一个set集合中(如果目标集合不存在,则会创建一个新的集合)
smove source destination member
9:查集合的差集(以第一个key为参照物)
sdiff key [key ...]
10:查集合的交集
sinter key [key ...]
11:查集合的并集
sunion key [key ...]

4. Hash

1:存
hset key field value
2:取
hget key field
3:批量存
hmset key field value [field value ...]
4:批量取
hmget key field [field ...]
5:取出所有键值对
hgetall key
6:删除指定值
hdel key field [field...]
7:获取指定key的长度
hlen key
8:判断key中值是否存在
hexists key field
9:只获得key中所有的field
hkeys keys
10:只获得key中所有的value
hvals key
11:指定field中的value值自增
(increment是自增的数量,相当于加法)
hincrby key field increment
12:hsetnx key field value

5. Zset

1:添加
score相当于一个排序标志(会按这个自动排序)
zadd key score member [score member...]
2:查看(正序或者倒序)
zrange key start stop [withscores]
zrevrange key start stop [withscores]
3:从小到大排序
(-inf +inf 负无穷到正无穷)
zrangebyscore key min max [withscores] [limit offset count]
4:移除元素
zrem key member [member...]
5:获取长度
zcard key
6:获取指定区间的个数
zcount key min max

5、 Redis特殊的三种数据类型

- geospatial 地理空间

1:添加指定地理位置(longitude,latitude 经纬度)
南极和北极无法添加;经纬度也有一定的范围
GEOADD key longitude latitude member [longitude latitude member]
2:返回两个给定位置之间的距离(计算距离时,会假定地球是个完美的球形)
如果两个位置之间的其中一个不存在,命令返回空值;指定单位的参数unit必须是以下单位的其中一个;m(米)km(千米)mi(英里)ft(英尺);如果没有指定单位,那么默认用米做单位
GEODIST key member1 member2 [unit]
3:返回一个或多个位置元素的Geohash表示(二位经纬度转换为一维的字符串)
GEOHASH key member [member...]
4:获取指定的地理位置信息
GEOPOS key member
5:以给定的经纬度为中心,找出一定半径内的元素(按坐标为范围查)
GEORADIUS key longitude latitude redius unit [withcoord] [withdist][withhash] [count]
6:找出位于指定范围内的元素,中心点是由给定的位置元素决定(按城市为范围查)
GEORADIUSBYMEMBER key member redius unit [withcoord] [withdist][withhash] [count]
7:zset的相关命令都可以使用

- hyperloglog

1:存pfadd key element [element...]
2:统计元素(两个key以上时,自动去重计算数量)pfcount key [key...]
3:合并集合(可以两个集合合并,也可以新命名一个集合,用于合并其他集合)
pfmerge destkey sourcekey [sourcekey...]

- bitmaps

1:存  value只有0或者1offset偏移量,位数,可以从0开始 setbit key offset value
2:查看某一天,某个偏移量的状态 getbit key offset
3:统计(统计为1的数量)bitcount key [start end]

6、Redis的事务

1. Redis单条命令是保证原子性的,但是Redis的事务是不保证原子性的;Redis事务没有隔离级别的概念 所有命令在事务中,并没有直接被执行,只有发起执行命令的时候才会被执行;

2. Redis事务的本质:一组命令的集合;一个事务中的所有命令都会被序列化,在事务执行过程中,会被按照顺序执行;一次性,顺序性,排他性;

3. Redis的事务命令

开启事务(命令:multi)
命令入队(添加相关命令)
执行事务(命令:exec

4. 中途放弃事务 可以使用 dicard

7、监控

一旦事务执行成功,监控就会自动取消掉;当做乐观锁操作

Watch 监视
unwatch 放弃监视

线程1

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

此时线程2进入

127.0.0.1:6379> get money
"100"
127.0.0.1:6379> incrby money 1000
(integer) 1100
127.0.0.1:6379>