文章目录
Redis基本概念
Redis是一个开源的(BSD协议),内存中的数据结构存储系统,可以用来作为数据库,缓存和消息中间件。
它支持多种类型的数据结构,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets),有序集合(sorted sets)与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘持久化(persistence)–RDB和AOP。
并通过Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
Redis中数据存放在内存中,也提供了Redis的持久化的方式是数据存储到磁盘
以key-value形式存储,提供丰富的数据类型可以使用多种开发场景(支持String、list、set、hash等数据结构)
Redis性能极高,redis 写8w/s,读 11W/s
Redis具有原子性,
Redis支持数据备份,集群高可用的功能
Redis基本操作
Redis默认是有16个数据库,默认使用的是第0个数据库,可以通过select 切换数据库,Redis的命令大小写不敏感的
Redis服务端启动:
redis-server redis.windows.conf
Redis客户端启动:
redis-cli -h IP地址 -p 端口 -a 密码
如果是登录远程redis需要使用-h参数,我们本次登录本机redis则不需要使用-h参数。
本地客户端登录用redis-cli 密码登陆(redis-cli -a password)
Redis关闭 :
通过客户端使用shutdown命令关闭redis服务。
切换数据库:
select index(0-15)
查看数据库大小
dbsize
查看所有的keys
keys *
清空数据库
清空当前数据库:flushdb
清空所有数据库:flushall
Redis是单线程
Redis是基于内存操作的,CPU不是Redis性能瓶颈,Redis的瓶颈就是根据机器的内存和网络带宽,CPU不是性能瓶颈,就可以使用单线程的
Redis的数据都是存放在内存中,所以说单线程去操作效率就是最高的,相比多线程,减少了CPU上下文切换耗时,对于内存系统而言,没有上下文切换的效率就是最高的,多次读写都是在同一个CPU
Redis五种基本数据类型
Redis键命令的基本语法: COMMAND KEY_NAME
示例如下:
基本命令:
SET 设置key
GET 查看key对应值
EXPIRE 设置key的过期时间
TTL 查看key剩余时间
EXISTS 判断当前key是否存在
KEYS * 查看所有的key
DEL 删除当前key
TYPE 查看key存储的value类型
1、字符串 string
set get
设置值 格式:set key value
获取值 格式:get key
特点:设置时key存在则value新值覆盖旧值
获取key不存在返回nil
exists
判断key是否存在 格式 exists key
存在返回 1
不存在返回 0
append
追加字符串,如果key不存在,相当于是set命令 格式:append key apendvalue
返回值是新字符串的长度
strlen
获取字符串的长度 格式:strlen key
incr decr
对value值进行自增1操作(如果key不存在,会被初始化为0) 格式: incr key
对value值进行自减1操作 格式:decr key
如果key不存在,会被初始化为0
incrby decrby
设置加减的大小 格式:incrby key num decrby key num
注意:我们也可通过incrby 负数来实现减法操作
同样也可以通过decrby 负数来实现加法操作
getrange
获取给定范围的字符串值 格式:getrange key start stop0
注意 0代表起始位置 -1代表终止位置
setrange
从指定的位置开始替换字符串的值 格式:setrange key offset value
注意:新数据多长就只替换多长数据 原不被替换的数据保持不变
setex ttl
设置过期时间 格式: setex key seconds values
查看剩余时间 格式:ttl key
注意:如果剩余时间为-2 代表已经过期,get就查询不到了
举例:验证码验证
setnx
setnx(set if not exists) 如果指定的key不存在则设置,存在就创建失败 格式: setnx key value
(分布式锁经常使用)
mset mget
同时设置多个值 格式:mset key1 value1 key2 value2 …
同时获取多个值 格式:mget key1 key …
getset
先获取值在设置值 格式:getset key value
应用场景:
计数器(粉丝数,统计数)
通常来保存单个字符串或者JSON字符串数据(短信验证码)
2、列表 list
类似于linkedList链表结构,可以添加元素到列表的头部或者是尾部,同样头部和尾部都可以进行获取
可以用来作为栈、队列、阻塞队列
lpush rpush lrange
从列表的左侧插入值 格式:lpush key value
从列表的右侧插入值 格式:rpush key value
从列表中获取指定范围的值 格式:lrange key start stop(-1代表最后一位)
lpop rpop
从列表的左侧移除值 格式:lpop key
从列表右侧移除值 格式:rpop key
lindex
获取指定下标的值 格式:lindex key index
注意:下表从零开始,如果超过索引位置返回nil
llen
获取列表中元素的个数 格式:llen key
lrem
已移除列表中的元素 格式:lrem key count value
注意:count表示移除的个数
ltrim
截取列表中的值 格式:ltrim key start stop
rpoplpush
移除列表中最后一个元素,将他添加到另一个列表中 格式:rpoplpush key1 key2
lset
根据下标替换列表中的值 格式:lset key index value
应用场景:
对数据量大的集合进行删减
列表数据显示:评论列表、关注列表、留言列表
list底层是一个链表
在链表插入或者改动值,效率高,中间位置来修改,相对效率低一些
队列:
lpush \rpop
栈:
lpush \ lpop
3、 集合 set
set中元素不能重复的
set实现是基于哈希表结构实现,在修改、添加等操作复杂度是O(1)
sadd smembers
在set集合中添加数据 格式:sadd key value
获取set集合中所有值 格式:smembers key
注:sadd添加时,value不能重复添加
sismember
判断某个值是否在set中 格式:sismember key value
scard srem
scard:获取set中元素个数 格式:scard key
srem 删除set中元素 格式:srem key value
srandmember spop
srandmember:从set中随机获取指定个数的值 格式:srandmember key count
spop 随机删除指定个数的元素 格式:spop key [count]
注意 count:表示数量
sdiff sinter sunion
sdiff:求多个集合的差集
sinter 求多个集合的交集
sunion: 求多个集合的并集
应用场景:
利用唯一性:可以统计访问网站的所有独立的ip
对集合间进行求交集、并集、差集 方便实现共同关注,共同喜欢,共同好友
4、哈希 hash
hash是一个map集合,是key-value的map集合
hset hget
插入和获取哈希的值 hset key field value /hget key field
hmset hmget
批量的插入和获取 格式:hmset key field1 value1 field2 value2 …
获取格式: hmget key field1 field2 …
hgetall
获取hash中所有的值 格式:hgetalll key
hdel
删除指定的filed 的哈希键值对 格式:hdel key field
hexitsts
判断哈数中字段是否存在 格式:hexists key field
hkeys hvals
获取哈数中所有字段或者值 格式 :hkeys key /hvals key
hsetnx
如果指定field存在,则添加失败,如果不存在,则添加成功 格式:hsetnx key field value
应用场景:
hash中存储经常变更的对象,比如用户信息: user :name-value age-value ,set-value
hash适合存储对象 ,String适合存储字符串
5、有序集合 zset
每个元素都会关联一个double类型的分数,Redis正是通过分数为集合中的
zadd
zadd :添加一个元素 格式:zadd key score member
zrange
zrange:获取指定key内的指定范围的元素 格式:zrange key start stop
注:zset根据指定分数的大小排序
zrangebyscore
将zset中的值按照从小到大排序数据 格式 zrangebyscore min max
如:zrangebyscore myzset -inf +inf
zrem
删除zset中指定的元素 格式:zrem key value
zcard
查看zset集合中元素的个数 格式:zcard key
zcount
根据score的值来统计给定区间的元素的个数 格式:zcount key min max
应用场景:
对于需要排序的场景下可以使用zset. 比如微博的实时新闻可以以发表时间作为score来存储,获取时就自动按时间来排好序