Redis
1:内存存储,持久化,内存中是断电即失,所以说持久化很重要(rdb,aof)
2:效率高,可以用于高速存储
3:发布订阅系统
4:计时器,计数器(浏览量)
特性:
1:持久化
2:多样的数据类型
3:集群
4:事务
基础知识
Redis是单线程的!6.0版本以后是多线程的
Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,
既然可以使用单线程来实现,就是用单线程了!所以 就是用了单线程
Redis是C语言写的,官方提供的数据为1000000+的QPS,完全不必Meecache差!
Redis为什么单线程这么快?
误区1:高性能的服务一定是多线程的?
核心:Redis是将所有数据放到内存中的,所以单线程操作效率就是最高的,多线程(CPU上下文会切换:耗时操作!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的内存情况下,这就是最佳方案!
误区2:多线程(CPU会上下文切换)一定比单线程效率高!
先去CPU>内存>硬盘的速度要有所了解
五大数据类型常用命令:
String类型
-
追加字符串
APPEND key value
-
获取字符串的长度
STRLEN
-
自增/自减运算
INCR/DECR
-
自增/自减指定的值
INCRBY/DECRBY
-
获取某个范围
GETRANGE
的字符串 -
替换某个范围的字符串
SETRANGE
-
设置过期时间
SETEX
-
不存在的时候才设置
SETNX
-
批量设置/获取值
MSET,MSETNX/MGET
-
获取当前的值的同时设置一个新值
GETSET
-
set k1 v1 # 设置值
-
127.0.0.1:6379> get k1 # 获得值
-
127.0.0.1:6379> keys * # 获取所有的key
-
127.0.0.1:6379> exists k1 # 判断某个key是否存在
-
127.0.0.1:6379> append k1 hello # 追加字符串,如果当前的key不存在,就相当于set
-
127.0.0.1:6379> strlen k1 # 获取字符串的长度
-
127.0.0.1:6379> set views 0 # 初始浏览量为0
-
127.0.0.1:6379> incr views # 自增1,浏览量增加1
-
decr views # 自减1, 浏览量减1
-
incrby views 10 # 可以设置步长,指定增量
-
# 字符串范围 range
-
set k1 hello,kuangshen # 设置k1的值
-
getrange k1 0 3 # 截取字符串[0,3]
"hell" -
getrange k1 0 -1 # 获取全部的字符串
"hello,kuangshen" -
setrange k1 1 xx # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get k1
"axxdefg"
# setex (set with expire) 设置过期时间
# setnx (set if not exist) 不存在再设置(分布式锁会经常用到)
setnx mykey redis # 如果mykey不存在,创建mykey
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) "k3"
2) "k2"
3) "k1"
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)
# 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 mongo # 如果存在值,则返回原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongo"
List类型
所有的List命令都是以l开头的,在redis里面我们可以把List玩成,栈、队列、阻塞队列!
-
List当中插入一个元素
LPUSH/RPUSH
-
List当中获取指定元素
LRANGE
-
移出List集合中的一个元素
LPOP/RPOP
-
移出List集合中指定的元素
LREM
-
根据索引(下标)获取集合中元素值
LINDEX
-
获取List的长度
LLEN
-
ltrim裁剪List为原来的一部分(直接修改原有List集合)
-
移出列表的最后一个元素,并移动到新的列表中
RPOPLPUSH
-
将列表中指定的下标值替换为另一个值,更新操作,如果下标不存在就会报错
-
在list集合中的指定元素前面插入值
linsert lst before world xiaofan
-
lpush list one # 将一个值或者多个值,插入到列表头部(左)
lrange list 0 -1 # 获取list中的值
lrange list 0 1 # 通过区间获取具体的值
rpush list four # 将一个值或者多个值,插入到列表尾部(右)
lpop list # 移出list的第一个元素(左)
rpop list # 移出list的最后一个元素(右)
lindex 根据下标获取元素
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> llen list # 获取长度
# 添加指定的值!
127.0.0.1:6379> lpush list one two three
(integer) 3
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
# 截断
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> ltrim list 1 2 # 通过下标截取指定的长度,这个list已经改变了,截断了,只剩下截取的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
rpoplpush 移除列表的最后一个元素,将他移动到新的列表当中
127.0.0.1:6379> rpush list1 a b c d
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpoplpush list1 list2 # 移除列表的最后一个元素,将他移动到新的列表中!
"d"
127.0.0.1:6379> rpoplpush list1 list2
"c"
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "d"
lset 更新list当中存在的元素
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list a
(integer) 1
127.0.0.1:6379> lset list 0 item # 如果存在当前下标值,则更新
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 value # 如果不存在当前下标值,则报错
(error) ERR index out of range
Set集合
-
集合中添加元素
sadd myset hello kuangshen lovekuangshen
-
查看集合中的元素
SMEMBERS
-
判断某个元素是否存在于集合中
SISMEMBER myset hello
-
获取集合中元素个数
SCARD
-
移出集合中指定的元素值
SREM
-
随机获取Set集合中的值
SRANDMEMBER
-
随机删除集合中的一个元素
SPOP
-
移动指定的元素到另一个集合当中去
SMOVE
-
差集/交集/并集
SDIFF/SINTER/SUNION
127.0.0.1:6379> sadd myset hello # set集合中添加值
(integer) 1
127.0.0.1:6379> sadd myset xiaofan
(integer) 1
127.0.0.1:6379> sadd myset lovexiaofan
(integer) 1
127.0.0.1:6379> smembers myset # 遍历set集合
1) "lovexiaofan"
2) "xiaofan"
3) "hello"
127.0.0.1:6379> sismember myset xiaofan # 判断某个值是不是在集合中
(integer) 1
127.0.0.1:6379> sismember myset xf
(integer) 0
127.0.0.1:6379> scard myset # 获取set集合中元素的个数
(integer) 3
127.0.0.1:6379> srem myset hello # 删除set中的指定的元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "lovexiaofan"
2) "xiaofan"
set是无序集合,随机抽取元素
127.0.0.1:6379> smembers myset
1) "wenfeiyang"
2) "lovexiaofan"
3) "xiaofan"
127.0.0.1:6379> srandmember myset 1 # 随机抽取一个元素
1) "wenfeiyang"
127.0.0.1:6379> srandmember myset 1
1) "wenfeiyang"
127.0.0.1:6379> srandmember myset 1
1) "lovexiaofan"
127.0.0.1:6379> srandmember myset 1
1) "xiaofan"
127.0.0.1:6379> smembers myset
1) "wenfeiyang"
2) "lovexiaofan"
3) "xiaofan"
127.0.0.1:6379> spop myset 1 # 随机删除一些set集合中的值
1) "lovexiaofan"
127.0.0.1:6379> spop myset
"xiaofan"
127.0.0.1:6379> smembers myset
1) "wenfeiyang"
smove myset myset1 a # 把指定元素从一个set集合移动到另一个set集合
(integer) 1
127.0.0.1:6379> smembers myset1
1) "a"
2) "xiaofan"
127.0.0.1:6379> smembers myset
1) "b"
2) "c"
Hash集合
-
设置一个具体的字段值
hset myhash field2 value2
-
设置多个个具体的字段值
hmset myhash field2 value2 field3 value3
-
获取多个指定的字段值
hmget myhash field1 field2
-
获取全部的值
hgetall myhash
-
删除hash指定的键
HDEL myhash field1
-
获取键值对的个数
HLEN
判断hash中指定字段是否存在HEXISTS
-
获取所有的key、value
HKEYS/HVALS
127.0.0.1:6379> hset myhash field1 kuangshen # set一个具体的值key-value
(integer) 1
127.0.0.1:6379> hget myhash field1 # 获取一个字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field1 hello field2 world # 设置多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash # 获取全部数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1 # 删除某个指定的key字段,对应的value值也就消失了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
######################################################################
127.0.0.1:6379> hset myhash field1 hello field2 world
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash # 获取hash表键值对的数量
(integer) 2
######################################################################
127.0.0.1:6379> hexists myhash field1 # 判断指定hash中的字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
######################################################################
127.0.0.1:6379> hkeys myhash # 获取所有的key
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash # 获取所有的value
1) "world"
2) "hello"
127.0.0.1:6379> hset myhash field3 10
(integer) 1
127.0.0.1:6379> hincrby myhash field3 2 # 增量运算
(integer) 12
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
5) "field3"
6) "12"
127.0.0.1:6379> hsetnx myhash field4 value4 # 如果不存在设置成功
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 abc # 如果存在则设置失败
(integer) 0
Zset有序集合
-
添加元素
zadd myset 1 one 2 two 3 three
-
获取所有元素
zrange myset 0 -1
-
排序
ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
-
升序/降序
zrange myzset 0 -1/ZREVRANGE myzset 0 -1
-
获取指定区间的元素个数
zcount myzset 1 4
zadd myset 1 one 2 two 3 three # 添加值
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zadd salary 2500 a 5000 b 500 c
(integer) 3
127.0.0.1:6379> zrange salary 0 -1 # 显示全部用户,从小到大
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrangebyscore salary -inf +inf # zrangebyscore 从小到大
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf # zrevrangebyscore 从大到小
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf withscores # 显示全部用户并且附带成绩
1) "b"
2) "5000"
3) "a"
4) "2500"
5) "c"
6) "500"
127.0.0.1:6379> zrem salary a # 移出某个元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "c"
2) "b"
127.0.0.1:6379> zcard salary # 有序集合中的个数
(integer) 2
127.0.0.1:6379> zadd myset 1 hello 2 world 3 xiaofan
(integer) 3
127.0.0.1:6379> zcount myset 1 3 # 获取指定区间之间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
127.0.0.1:6379> zcount myset 1 1
(integer) 1
三种特殊的饿数据类型
geospatial 地理位置
# 注意
# 1. 经纬度
# 2. 官方文档
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 120.153576 30.287459 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 125.14904 42.927 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 112.549248 37.857014 taiyuan
(integer) 1
geopos 获取指定城市的经纬度
127.0.0.1:6379> geopos china:city taiyuan
1) 1) "112.54924803972244263"
2) "37.85701483724372451"
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.40528291463851929"
2) "39.9049884229125027"
geodist 获取两个位置之间的距离
m 为米。
km 为千米。
mi 为英里。
ft 为英尺。
127.0.0.1:6379> geodist china:city beijing taiyuan km
"404.1120"
127.0.0.1:6379> geodist china:city beijing shanghai
"1067597.9668"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.5980"
GEORADIUS具体指定位置多少范围内的所有城市
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "hangzhou"
3) "taiyuan"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord(显示具体经纬度)
GEORADIUS china:city 110 30 400 km withdist(显示距离)
1) 1) "chongqing"
2) 1) "106.50495976209640503"
2) "29.53315530684997015"
2) 1) "hangzhou"
2) 1) "120.15357345342636108"
2) "30.28745790721532671"
3) 1) "taiyuan"
2) 1) "112.54924803972244263"
2) "37.85701483724372451"
# 获取指定的个数
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord count 2(显示数量)
1) 1) "chongqing"
2) 1) "106.50495976209640503"
2) "29.53315530684997015"
2) 1) "taiyuan"
2) 1) "112.54924803972244263"
2) "37.85701483724372451"
连接:通过本地配置文件进行连接