Redis基本了解
Redis
redis 默认有16个数据库,可从redis.conf 查看,默认使用第0个
databases 16
基本命令
Redis命令:https://redis.io/commands
select 3 # 切换到第三个数据库
dbsize # 当前库数据库大小
keys * # 查看当前库所有的 key
flushdb # 清空当前库
flushall # 清空全部数据库
exists name # 判断name 是否存在
move name 1 # 将name 从当前库移动到 库1
expire name 10 # 设置name 10秒过期
ttl name # 查看name的剩余时间
type name # 查看当前key 的类型
redis 是单线程的 !
redis 是基于内存操作,CPU 不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络的带宽,既然可以使用单线程实现,就使用了单线程。
Redis 是C语言写的,官方提供的数据为 100000+ 的QPS(每秒查询率)
为什么CPU 不是Redis性能瓶颈?
原文博客:https://blog.csdn.net/PERCENTILE__/article/details/108392930
-
redis在内存里,省下来cpu从硬盘里取数据拿到内存的时间。
-
redis是单线程,省下来cpu切换线程恢复线程的时间。
-
redis是单线程的,所以服务器是单核还是多核cpu对他没什么影响,因为他的多次读写都是在一个cpu上的。
-
cpu不可能对他一点影响没有,但是相比别的数据库,redis受cpu的限制太少了。
Redis为什么单线程还这么快?
Redis 将所有的数据放在了内存中的。
多路复用
五大数据类型
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String(字符串)
value 除了是我们的字符串还可以是我们的数字
set key1 v1 #设置值
get key1 #获取值
getset key1 aa #先获取值再设置值
append key1 "hello" #追加字符【当前key不存在,新建】
strlen key1 #获取key长度
############### 步长 ######################
incr a #加1操作
decr a #减1操作
incrby a 10 #加10操作
decrby a 10 #减10操作
################ 字符串范围 #####################
getrange key1 0 3 #截取字符串[0,3]
getrange key1 0 -1 #获取所有字符串
setrange key1 1 XX #替换指定位置开始的字符串
################# ####################
#setex (set with expire) #设置过期时间
setex key1 30 "hello" #设置key1的值为hello,过期时间是3秒
#setnx (set if not exist) #不存在设置
setnx key2 "redis" #设置成功
setnx key2 "mongodb" #设置失败,因为已经存在该 key2
#################### 多个值操作 #################
mset k1 v1 k2 v2 k3 v3 #一次设置多个值
mget k1 v1 k2 v2 k3 v3 #一次获取多个值
msetnx k1 v1 k2 v2 k3 v3 #metnx 是一个原子性的操作,要么全部成功,要么全部失败
#################### 对象 #################
set user:1 {name:zhangsanm,age=10} #设置一个user:1 对象,值为 json 字符串来保存一个对象
mset user:2:name lisi user:2:age 20
mget user:2:name user:2:age
List(列表)
可作为栈、队列使用
lpush list a b #从左侧放入
rpush list z #从右侧放入
lrange list 0 -1 #获取列表中的值
lrange list 0 1 #通过区间列表中的值
llen list #获取长度
##lpop、rpop
lpop list #从左侧移除一个元素
rpop list #从右侧移除一个元素
##lindex
lindex list 1 #通过下标获取list 的某一个值
##lrem
lrem list 1 one #移除一个list中的one值
lrem list 0 a #移除list中所有的a
##ltrim 截取
ltrim list 2 4 #截取值 [2,4],list 被修改
##rpoplpush
rpoplpush list mylist #从list右侧获取一个值,移动到mylist
##lset 将列表中指定下标的值替换为另外一个值,更新操作
lset mylist 0 itm #将mylist中下标为0的值,替换为itm,0不存在会报错
##linsert
linsert mylist before "world" "other" #将值插入到"world" 之前
linsert mylist after "world" "other2" #将值插入到"world" 之后
Set(集合)
sadd key1 "hello" "world" # set集合中添加元素
smember key1 # 查看set中的值
sismember key1 hello # 判断set集合中是否存在该值
scard key1 # 获取元素个数
srem key hello # 移除set中的元素
##随机获取
srandmember key1 # 随机获取set中的一个元素
srandmember key1 2 # 随机获取set中的两个元素
##随机删除
spop key1 # 随机删除一个元素
##将一个值移动到另外一个集合
smove key1 key2 2 # 将元素 2 从key1集合中移动到key2集合中
##交集、差集、并集
sdiff key1 key2 # 差集
sinter key1 key2 # 交集
sunion key1 key2 # 并集
Hash(哈希)
key - map
hset k1 a 1 # 设置 key-value
hget k1 a # 获取hash中a的值
hmset k1 a 1 b 2 c 3 # 设置多个 key-value
hmget k1 a b c # 获取多个值
hgetall k1 # 获取全部数据,包括 key-value
hdel k1 a # 删除hash中指定的值
hlen k1 # 获取hash长度(元素数量)
hexists k1 a # 判断hash是否存在指定字段
##只获得所有的key,value
hkeys k1 # 获取hash所有的key
hvals k1 # 获取hash所有的value
# 数字类型增减操作
hincrby k1 b 3 # hash中 b的值加3
hincrby k1 b -2 # hash中 b的值减2
# hsetnx
hsetnx k1 b world #如果b存在则设置失败,反之设置成功
Zset(有序集合)
在set 基础上,增加了排序。
zadd k1 1 one 2 two 3 three # 设置1号位置为one,2号位置为two...
zrange k1 0 -1 # 获取所有元素
zrangebyscore k1 -inf +inf # 获取-∞, +∞ 之间的数,正序输出
zrangebyscore k1 -inf 2 # 获取小于 2的元素
zrevrange k1 0 -1 # 获取所有元素,倒序输出
zcard k1 # 获取元素个数
zcount k1 1 3 # 获取指定区间内个数 [1,3]