Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
简言之:redis可做用于数据库,缓存,消息中间件mq
1.关于redis基础命令{不区分大小写}:
1.1.1redis有16个库,切换库用select 0/7
1.2. dbsize 库大小
1.3. keys * 查看当前库所有key
1.4. flushdb(清除当前库),flushall(清除所有库数据)
1.5.get name 获取,set name xzy(设置name为xzy的一条数据)
1.5.1 exists name (key为name是否存在)
1.5.2 expire name 10 设置name设置后10s过期
1.5.3 ttl name 查询倒计时
1.5.4 move name 1 移除当前的key
1.5.5 type name 查看key的类型
1.6. 6379默认端口号(一个意大利女星的名字手机上的数据),mysql3306(女儿的名字)
1.7.redis是基于内存操作,cpu不是redis的性能瓶颈,内存和网络带宽才是,可以使用单线程来实现
1.8.redis是c语言写的,官方数据:10w+ Qps,
误区1:高性能服务器一定是多线程
误区2:多线程一定比单线程快
cpu>内存>硬盘
核心: redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!),
对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
2.五大数据类型
redis-key
2.1 string
>append name 'xch' 往name的这个key后面追加xch字符(无key则新建)
>strlen name 获取字符串的长度
>set v 0
>incr v (值+1)
>decr v (值-1)
>incrby v 10 (设置步长,值+10)
>decrby v 10 (设置步长,值-10)
>getrange name 0 2 (截取切片)
>setrange name 1 xx (分片取值后进行替换)
>setex(set with expire) 设置过期时间
>setnx(set if not exist) 不存在再设置(在分布式锁中常用到)
>mset set a b c d e (批量设置key)
>msetnx a b c d e (已经有值则不成功,要么全失败要么全成功)
>set user:1{name:xzy,age:30}
>mset user:1:name xzy user:1:age 30 (高阶一点:设置user:1中name和age的值)
>mget user:1:name user:1:age (查询user:1中的name,age的值)
getset (先get再set)
>getset db redis #如果不存在值则返回nil
nil
>getset db mysql #如果存在值则返回原来的值,并设置新的值
redis
>get db
mysql
2.2 list
所有list命令都是以‘l’开头的
>lpush list one (默认往左边添加)
>lpush list two
>lpush list three
>lrange list 0 -1
1)'three'
2)'two'
3)'one'
>lange 0 1 (倒序取值)
1)'three'
2)'two'
>rpush list four (放在右边)
>lrange 0 -1
1)'three'
2)'two'
3)'one'
4)‘four’
>lpop list (移除左边)
‘three’
>rpop list (移除右边)
'four'
>lindex list 1 (通过下标获取值)
'one'
>llen list (获取列表的长度)
2
>lrem list 1 one (移除指定几个值,如果要移除2个则:lrem list 2 one)
trim #修剪
>ltrim list 1 2 (截取指定长度)
>lrange list 0 -1
1)'two'
2)'three'
rpoplphsh:(先移除在添加到另一个新的列表)
>rpopphsh list otherlist (将list列表中右侧值移动到otherlist 列表中)
>exist list (判断列表是否存在)
>lset list 0 a (更新指定列表指定下标的值,列表或者下标不存在都会报错)
linsert list before/after 'one' 'ten' (将某个值插入列表值的前面或者后面)
2.3 set (所有的命令都加‘s’)#无序不重复集合
>sadd myset 'hello' #添加集合元素
(integer)1
>sadd myset 'world'
(integer)1
>smembers myset #查询集合元素
1)'hello'
2)'world'
>sismember myset hello #判断集合中是否有元素
(integer)1
>sismember myset hi
(integer)0
>scard myset #获取set集合中的元素个数
>srem myset hello #移除set中的指定元素
>srandmember myset #随机抽选出一个元素
>spop myset #随机移除集合元素
>smove set1 'hello' set2 #将集合1中指定元素移到集合2中
set1{a,b,c},set2{c,d,e}
>sdiff set1 set2 #以set1做基准取差集
'a','b'
>>sinter set1 set2 #交集
'c'
>sdiff set1 set2 #并集
a,b,c,d,e
2.4 hash map集合(与string类型操作类似)
所有的命令都加‘h’
>hset myhash field xzy
(integer)1
>hget myhash field
xzy
>hmset myhash f1 xzy f2xch #同时设置多个key-value
ok
>hmget myhash f1 f2
1)xzy
2)xch
>hgetall myhash #获取所有值
>hdel myhash f1 #删除指定的key-value
>hlen myhash f1 #获key为f1的value长度
>hexists myhash f1 #判断hash中指定字段是否存在
>hkeys myhash #查询所有的key值
>hvals myhash #查询所有的value值
>hset myhash f3 10
>hincrby/hdecrby myhash f3 2 #hash 中指定key步长自增
>hsetnx myhash f4 zj #添加key-value,没有的话添加成功,有的话添加不了
(integer)1
>hsetnx myhash f4 zjj
(integer)0
hash的应用:用户信息,经常变动的信息,适合对象的存储
2.5 zset(有序集合)
所有的命令都加‘z’
>zadd myzset 1 one 2 two 3 three #增加集合数据
(integer)3
>zrange myzset 0 -1 #查询所有集合数据
>zadd myzset 1000 zhangsan
>zadd myzset 250 lisi
>zadd myzset 5000 wangwu
>zrangebyscore myzset -inf +inf #从小到大排序所有用户
1)lisi
2)zhangsan
3)wangwu
>zrangebyscore myzset -inf +inf withscores #显示全部用户且带值
1)lisi
250
2)zhangsan
1000
3)wangwu
5000
>zrangebyscore myzset -inf 2500 withscores #显示值小于2500的数据升序
1)lisi
250
2)zhangsan
1000
>zrevrange myzset 0 -1 #从大到小排序
wangwu
lisi
>zrem myzset zhangsan #移除某个特定元素
>zcard myzset #获取有序集合的个数
>zcount myzset 1 2 获取有序集合范围区间内的个数
3三种特殊数据类型
3.1 geospatial
geo:geospatial (地理位置经纬度) redis3.2版本推出(基于zset底层封装的,所以也可用zset命令来操作)
6个命令:
>geoadd china:city 116.4 39.9 beijing #添加城市的经纬度
>geoadd china:city 120.4 45.9 shanghai
>geoadd china:city 106.4 29.9 chongqin
>geopos china:city bejing #获取特定城市的经纬度
>geodist china:city bejing shanghai km #2个城市的距离,,单位:m,km,mi(英里),ft(英尺)
>georadius china:tity 110 30 1000km #查找某个经纬度为中心半径为1000km的数据
>georadius china:tity 110 30 1000km withdist #显示到中间距离的位置
>georadius china:tity 110 30 1000km withcoord #显示他人的定位信息
>georadius china:tity 110 30 1000km withcoord count #筛选指定结果
>georadiusbymember china:tity benjing 1000km #找出位于指定元素周围的其他元素
>geohash china:city benjing #经纬度的字符串(将二维的经纬度转换为一维的字符串)
3.2 hyperloglog 基数(不重复的元素)基数统计的算法
应用于uv
>pfadd mykey a b c d e f g h i j #添加一组元素
(integer)1
>pfcount mykey #统计元素基数数量
10
>pfadd mykey2 i j z x c v b n m
(integer)1
> pfmerge mykey3 mykey mykey2 将mykey mykey 合并到mykey3中
>pfcount mykey3 #查看并集的数量
15
3.3 bitmaps (位存储) 值只有0或者1,适用于只有2种状态的记录
>setbit sign 0 1 #设置一组数据如周一到周五的打卡情况
>setbit sign 1 1
>setbit sign 2 0
>setbit sign 3 1
>setbit sign 4 0
>getbit sign 0 #获取打卡情况
1
>getbit sign 4
0
>bitcount sign #统计打卡的天数
(integer)3
run redis run !!!