Redis 基础指令
1.redis-server redis.conf:找到redis.conf文件使用该命令启动
2.redis-cli -p 6379
flushdb :清空当前数据库
select 2:选择 2数据库
service redis restart: 重启redis
String
keys * 查询所有key
EXISTS name :查询是否有为name的key 有返回1 无返回 0
move name 1 :移除 1 数据库里的 name的key
expire name 10 :10秒后name 这个key过期
ttl name :查看name的剩余时间
type name :查看name的类型
append name :在name后面追加字符串!{如果当前的key不存在 则默认创建一个名为 name 的key}
strlen name:返回字符串的长度
incr age :给age+1
decr age:给age-1
incrby age 10: 给age+10
decrby age 10:给age-10
getrange name 0 3 :截取字符串[0,3]
getrange name 0 -1:得到全部字符串
原name “abcdefg”
setrange name 1 xx :从第一位开始,包括第一位本身替换为xx
改后 name ”axxdefg“
setex name 30 “hello” 设置一个30秒后过期的key
setnx name “redis” :如果不存在name就设置成功返回1 否则返回 0
mest k1 v1 k2 v2 k3 v3 :设置多个KV
msetnx k1 v1 k4 v4 :都不存在时设置成功 , 有一个存在就设置失败
mest user:1 {name:zhangsan,age:3} :设置一个user:1 对象值为json字符来保存一个对象
getset name zhangsan :先get 如果不存在name则返回nil ,然后再给name set一个zhangsan,存在name就返回name的值(简称取 旧值设新值)
List
LPUSH list one :将一个值或多个值插入到list头部
LPUSH list two
LPUSH list three
Lrange list 0 1 :获取区间[0,1]的值
LRANGE list 0 -1:获取list中所有的值
“three ”
“two“
“one“
查询排序是倒过来的因为新的值进来之前的值就会后移
RPUSH list right :在尾部插入一个或多个值,值为right
“three ”
“two“
“one“
“right”
LPOP list :移除list的第一个元素
RPOP list : 移除list的最后一个元素
Lindex list 1:通过下标获取list中第 1 位的值
Lrem list 1 “one” :移除在list中 1个(也可以是两个) 指定的 value=“one”的值
Ltrim list 1 2:通过下标截取指定的长度[1,2]的部分,之后list被改变 ,只有截取的部分的[1,2]
rpoplpush list newlist:移除list中最后一个元素 放到 newlist 中
EXISTS list:检测是否存在list
lset list 0 newvalue :将列表中下标为0的值更新为newvalue,若不存在则会报错
linsert mylist before “A” “B” :在A 的前面插入B
linsert mylist before “A” “C” :在A 的后面插入C
Set
sadd myset hello: 往myset中添加hello
smembers myset: 查看 myset里面的值
sismember myset hello:判断myset中是否有hello ,有的话返回1 没有的话返回0
scard myset:获取myset 集合中元素个数
srem myset hello :移除myset中的 hello元素
srandmember myset :随机在myset中抽一个元素
srandmember myset 2 :随机在myset中抽 2 个元素
spop myset :随机删除一个myset中的元素
smove myset myset2 ”hello“:将myset中hello元素移动到myset2
假设{myset 中 “a”b"c" myset2 中 "c"d"e"}
sdiff myset myset2 :差集 {指myset之中不同于与myset2的元素的集合} 结果:ba
sinter myset myset2 :交集
sunion myset myset2 :并集
Hash
{ key :{ key:value } }
hash适合对象的存储
hset myhash filed name :set一个 key为myhash 的 Map ,Map的key为 filed ,value为 name
hget myhash filed :取值 结果:name
hset myhash filed name filed2 age:set一个 key为myhash 的 Map ,Map的key为 filed ,value为 name 第二个Map 的key为
filed2 值为age
hget myhash filed filed2 :取值 结果:name age
hdel myhash filed:删除指定的Map的key
hexist myhash filed:判断hash中指定的字段是否存在
hkeys myhash :查看 myhash中所有的key
hincrby myhash field 5 :给filed的value+5
hdecrby myhash filed 3:给field的value -3
hsetnx myhash file name:set操作 成功返回1失败返回0
Zset(有序集合)
在set的基础上增加了一个值 ,set k1 v1 zset k1 score1 v1
zadd myset 1 one :添加一个值 1为序号
zadd myset 2 two 3 three:添加多个值 2 3 为序号
zrange myset 0 -1:查询myset 结果 one two three
zrangebyscore myset -inf +inf:查询score范围是正无穷到负无穷的 myset;(正序)
zrangebyscore myset -inf +inf withscore:查询score范围是正无穷到负无穷的 myset 且打印score;
zrange myzset 0 -1 withscores :按序号查询所有
zrevrangebyscore myzset 5 1 withscores:按序号查询 score 为1 到 5的 value并打印score (倒序)
zrangebyscore myzset -inf 3 withscores:查询score从负无穷到3的所有
zrem myzset one:移除myzset中的one
zcard myzset :获取myzset集合中的个数
zcount myzset 1 5:获取score 1 5 之间的成员数量
geospatial
geoadd china:city 116.40 39.90 beijin:设置 经纬度
geopos china:city beijin : 得到经纬度
geodist china:city beijin shanghai km:计算北京和上海两地之间的距离 KM可替换M、MI、ft
georadius china:city 110 30 1000 km:以 110 30为经纬度 搜寻半径1000km 的 地区
georadius china:city 110 30 1000 km withdist :连同距离一起返回
georadius china:city 110 30 1000 km withcoord:连同地理位置一起返回
georadius china:city 110 30 1000 km count 2:只查出范围内的 2 个人
georadiusbymember china beijin 10000 km:以北京为中心 找半径10000km的城市
Hyperloglog
pfadd mykey a b c d e e:向mykey存入6个value
pfcount mykey :结果为 5 计算基数(一个集合中不重复的数的数量)
pfmerge mykey3 mykey mykey2 :把mykey和mykey2合并到 mykey3中
Bitmap
打卡问题可以通过bitmap解决
setbit sign 0 0:设置 sign的 0位为 0
setbit sign 1 1:设置 sign的 1位为 1
setbit sign 2 1:设置 sign的 2位为 1
getbit sign 2:get sign第二位的value
bitcount sign:计算 value为1 的数量
事务
Redis事务的本质:一组命令的集合!一个事务中所有的命令都会被序列化,在事务执行的过程中,按照顺序执行,事务执行完就没有了
一致性、顺序性、排他性! 执行一些列的命令!
Redis事务没有隔离级别的概念!
所有的命令在事务中,并没有被执行!只有发起执行命令的时候才会执行! Exec
Redis单挑命令保持原子性,但是事务不保证原子性
Redis的事务:
1.开启事务:multi
2.命令入队:(....)
执行事务:exce :执行完事务后失效
3. or
放弃事务:discard :放弃之后队列操作失效
编译型异常(代码有问题!命令有错!),事务中所有的命令都不会被执行!
运行时异常,如果事务队列中其中一个存在错误,则此命令报错,其他照常执行
悲观锁:很悲观,十分谨慎,什么时候都会出问题,无论做什么都加锁,
乐观锁:认为什么时候都不会出问题,所以不上锁, 更新数据时判断一下在此期间是否有人改动过这个数据。 先获取version 然后更新的时候比较version
watch money:监视money 的值在一个事务中,如果其他的 线程 修改了money的值,则此事务失败
解锁 unwatch 先取消锁
再进行下一次watch
watch 操作
1. watch money:得到最新的money 2. multi :事务开始
-
事务列队
-
exec:事务执行 , 此时检查money现在是否与 watch money时 发生了变化,没有变化 成功执行,变化了执行失败,执行失败先unwatch 解锁后 再 watch就行
Redis.conf详解
启动的时候,就通过配置文件来启动
网络
bind 127.0.0.1 绑定的IP
protected—mode yes:保护模式 开启
port 6379 :端口号
通用GENERAL
daemonize yes 以守护进程的方式运行,默认no,需要自己开启为yes
pidfile /var/run/redis_6379.pid :如果以后台的方式运行,我们就需要指定一个pid文件
loglevel notice :日志级别 有debug verbose notice warning
logfile “日志的文件位置名”
databases 16 数据库的数量 默认16个
快照
持久化,在规定的时间内执行了多少次操作,则会持久化到文件 .rdb .aof
因为redis是内存数据库,如果没有持久化,那么数据断电即失!
save 900 1:如果900s内,至少有 1 个key进行了操作,就进行持久化操作
save 300 10:如果300s内,至少有 10 个key进行了操作,就进行持久化操作
save 60 10000:如果60s内,至少有 10000 个key进行了操作,就进行持久化操作
stop-writes-on-bgsave-error yes 持久化如果出错是否需要继续工作
rdbcompression yes :是否压缩rdb文件,需要消耗一定的CPU资源
rdbchecksum yes:保存rdb文件的时候,进行错误的检查效验
dir ./ rdb文件保存目录
security
requirepass 123 :设置密码为123
限制CLIENTS
maxclients 10000 设置连接上redis的客户端最大为10000
maxmemory <bytes> redis配置最大的内存容量
maxmemory-policy noeviction # maxmemory-policy 内存达到上限的处理策略
volatile-lru:利用LRU算法移除设置过过期时间的key。
volatile-random:随机移除设置过过期时间的key。
volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
allkeys-lru:利用LRU算法移除任何key。
allkeys-random:随机移除任何key。
noeviction:不移除任何key,只是返回一个写错误。
Append only 模式 aof配置
appendonly no 默认不开启,默认使用rdb方式持久化,大部分情况下 rdb完全够用
appendfilename “appendonly.aof” 持久化文件的名字
appendfsync eversec:每秒执行一次同步,但可能丢失这一秒的数据
appendfsync always :每次修改都会同步一次,但会消耗性能
appendfsync no 不同步数据,这个时候操作系统自己同步数据,速度最快
持久化
rdb 和 aof
rdb保存的文件是 dump.rdb
rdb 触发机制
1.save的规则满足的情况下
2.执行flushall命令
3.退出redis
rdb文件在redis bin文件下
优点 :
1.适合大规模的数据恢复!
2.对数据的完整性要求不高!
缺点:
1.需要一定的时间间隔进行操作。如果redis意外宕机,最后一次的修改就没有了
2.fork进程的时候,会占用一定的内存空间
AOF
将我们所有命令都记录下来,恢复的时候就把这个文件再执行一遍
appendonly no:默认不开启 需要手动开启 配置为yes
重启redis 即可产生aof文件
如果aof文件有错误 , 这时候redis无法启动,则需要aof文件,redis提供了一个工具
redis-check-aof -fix appendonly.aof:修复appendonly.aof
优点:
1.每一次修改都同步,文件完整性会更好
2.每秒同步一次,可能会丢失一秒数据
3.从不同步,效率最高!
缺点
1.相当于数据文件来说,aof远远大于rdb,修复速度也比rdb慢
2.aof运行效率也要比rdb慢,所以redis的默认配置是rdb持久化
订阅者: redis 127.0.0.1:6379> SUBSCRIBE redisChat :订阅了 redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
发布者: redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Redis"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Hello,Kuangshen"
(integer) 1
订阅者接收到:
-
"message"
-
"redisChat"
-
"Hello,Redis"
-
"message"
-
"redisChat"
-
"Hello,Kuangshen"