Redis基本知识说明
127.0.0.1:6379> select 3 # 切换数据库
OK
127.0.0.1:6379[3]> dbsize # 查看DB大小
(integer) 0
127.0.0.1:6379[3]> keys * # 查看所所有key
(empty list or set)
127.0.0.1:6379[3]> flushdb # 清除当前数据库
(empty list or set)
127.0.0.1:6379[3]> flushdb # 清除全部数据库的内容
(empty list or set)
Redis 是单线程的!
明白Redis 是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能平静,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就是用单线程了,所以就用了单线程!
Redis是C 语言写的,官方提供数据为 100000+ 的QPS,完全不比同样是使用key-value的Memecache差
Redis 为啥单线程还这么快?
1 .误区1:高性能的服务器一定是多线程的
2. 误区2:多线程(CPU上下文会切换!),一定比单线程效率高!
CPU > 内存 > 硬盘
核心 :redis是将所有的数据全部存放在内存中,所以说单线程去操作的效率就是最高的,对于内存来说,如果没有上下文切换效率就是最高的
(1) 基于内存操作:Redis 的所有数据都存在内存中,因此所有的运算都是内存级别的,所以他的性能比较高;
(2) 数据结构简单:Redis 的数据结构是专门设计的,而这些简单的数据结构的查找和操作的时间大部分复杂度都是 O(1),因此性能比较高;
(3) 多路复用和非阻塞 I/O:Redis使用 I/O多路复用功能来监听多个 socket连接客户端,这样就可以使用一个线程连接来处理多个请求,减少线程切换带来的开销,同时也避免了 I/O 阻塞操作;
(4) 避免上下文切换:因为是单线程模型,因此就避免了不必要的上下文切换和多线程竞争,这就省去了多线程切换带来的时间和性能上的消耗,而且单线程不会导致死锁问题的发生;
RedisKey 的基本命令
127.0.0.1:6379> set name krien
OK
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> move name 1 # 当前数据库移除name
127.0.0.1:6379> get name # 获取name
“krien”
127.0.0.1:6379> EXPIRE name 10 # 设置过期时间
127.0.0.1:6379> ttl name # 查看过期剩余时间
String (字符串)类型详解
基本操作
1. 添加/修改一个键值对
set key value
2. 按key获取value
get key
3. 添加/修改一至多对键值对
mset key1
4. 按key获取一至多个value
mget key1 [key2....]
5. 在原有value后追加内容
append key value
6. 查看字符串长度
strlen key
7. 获取范围时[stratindex,endindex]的子串 (*index从零开始,-n表示倒数第n个字符)
getrange key startindex endindex
8. 仅在key不存在时,添加一个键值对
set key value nx
setnx key value
9. 仅在key已存在时,修改一个键值对
set key value xx
10. 修改一个键值对并返回原值,原值不存在则返回nil
set key value get
getset key value
11. 批量版setnx
msetnx key1 value1 [key2 value2 ...]
如果字符串的内容是整数
1. 按key创建值为1的value,或使value增长(increase)1
incr key
2. 按key使value增长(increase)给定数值
incrby key 数值
3. 按key使value减少(decrease)1
decr key
4. 按key使value减少(decrease)给定数值
decrby key 数值
临时键值对
生存时间time to live ,简写为ttl ,指键值对距离被删除的剩余秒数
*如果重新set , 生存时间(time to live, ttl)
以下操作支持各种数据类型:
1. 设置一个生存时间
expire key 秒数
2. 查看生存时间的剩余秒数(*key不存在则返回-2,永久键值对-1)
ttl key
3.毫秒版expire
pexpire key 毫秒数
4. 毫秒版ttl
pttl key
5. 持久化(取消生存空间)
persist key
代码示例
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 # 获得值
"v1"
127.0.0.1:6379> APPEND key1 "hello" # 追加字符串,如果当前key不存在,相当于set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 # 获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 ",krien"
(integer) 13
127.0.0.1:6379> get key1
"v1hello,krien"
i++
步长
i++
步长
127.0.0.1:6379> set views 0 # 设置浏览量
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views # 自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCRBY views 10 # 可以设置步长,指定增量!
(integer) 10
127.0.0.1:6379> INCRBY views 10
(integer) 20
127.0.0.1:6379> DECRBY views 10
(integer) 10
字符串范围range
127.0.0.1:6379> set key1 "hello,krien" # 设置key1的值
OK
127.0.0.1:6379> get key1
"hello,krien"
127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串 [0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串 , 和 get key是一样的
"hello,krien"
############################################################################
** 替换 **
127.0.0.1:6379> set key1 "hello,krien"
OK
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
######################################################################
# setex (set with expire) 设置过期时间
# setnx(set if not exist) 不存在设置
127.0.0.1:6379> setex key3 30 "hello" # 设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 23
127.0.0.1:6379> setnx mykey "redis" # 如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
3) "mykey"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB" # 如果mykey存在,创建失败!
(integer) 0
127.0.0.1:6379> get mykey
"redis"
#############################################################################
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 # msetnx 是一个原子性的操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
############################################################################
对象
set user:1 {name:zhangsan,age:3} #设置一个user: 对象 值 为json字符串来保存一个对象
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
################################################################3
getset # 先get然后再set
127.0.0.1:6379> getset db redis # 如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
数据结构是相同的!
String类似的场景:value除了是我们的字符串还可以是我们的数字!
- 计数器
- 统计多单位的数量
后续更新ing。。。