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)。

应用

1、内存存储、持久化
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(比如统计浏览量)

安装使用

如果是宝塔面版安装,会自动开启服务

如果是yum安装,需要修改配置文件中的daemonize的值为yes,默认后台启动,然后用命令开启

开启服务

redis-server 配置文件(redis.conf)

客户端连接

redis-cli -p 6379

Redis简单命令

127.0.0.1:6379> ping #测试连接
PONG
127.0.0.1:6379> set name zzf #设置key-value
OK
127.0.0.1:6379> get name #查看key值对应的value
"zzf"
127.0.0.1:6379> keys * #查看所有的key
1) "name"
127.0.0.1:6379> select 3  #切换数据库(默认有16个)
OK
127.0.0.1:6379[3]> dbsize #查看当前使用的数据库大小
(integer) 0
127.0.0.1:6379> flushdb #清空当前数据库
OK

清除全部数据库内容FLUSHALL

Redis是单线程的,那为什么能这么快

redis是基于内存操作的,将所有数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程CPU上下文会切换,相当耗时

Key相关指令

127.0.0.1:6379> set name zzf
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> EXISTS name #查看key是否存在
(integer) 1
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> move name 1 #从当前数据库移走key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name zzf
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"zzf"
127.0.0.1:6379> EXPIRE name 3 #设置key3秒后过期
(integer) 1
127.0.0.1:6379> get name
"zzf"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type age #查看key的类型
string

Redis提供的5种结构

结构类型结构存储的值结构的读写能力
STRING可以是字符串、整数或者浮点数对整个字符串或字符串中的其中一部分执行操作;对整数和浮点数执行自增或自减操作
LIST一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪;读取单个或者多个元素;根据值查找或者移除元素等
SET包含字符串的无序收集器,并且被包含的每个字符串都是不相同的添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里随机获取元素等
HASH包含键值对的无序散列表添加、获取、移除单个键值对;获取所有键值对等
ZSET字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、移除单个元素;根据分值范围或成员来获取元素

String类型

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 #查看key对应的值的长度
(integer) 7
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views #自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 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 #增加10
(integer) 10
127.0.0.1:6379> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 10 #减10
(integer) 10
127.0.0.1:6379> decrby views 10
(integer) 0
127.0.0.1:6379> get views
"0"

字符串范围

127.0.0.1:6379> set key1 "hello world"
OK
127.0.0.1:6379> get key1
"hello world"
127.0.0.1:6379> getrange key1 0 3 #截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 #获取全部字符串,相当于get key
"hello world"

替换

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"
127.0.0.1:6379> setex key3 10 "hello" #创建key并设置过期时间
OK
127.0.0.1:6379> ttl key3 #查看还有多久过期
(integer) 6
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" #不存在则设置
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "mykey"
3) "key1"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "test" #已存在,设置会失败
(integer) 0
127.0.0.1:6379> mset k1 v1 k2 b2 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) "b2"
3) "v3"
127.0.0.1:6379> msetnx k1 b1 k4 v4 #如果不存在则设置多个值,如果其中一个存在,就一起失败
(integer) 0
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "b2"
3) "v3"
127.0.0.1:6379> set user:1 {name:zhangsan,age:3} #设置一个json字符串,存储对象
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"

#另一种方法存对象
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"

组合命令

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"

List

127.0.0.1:6379> lpush list one #将值推入列表的左端(头部)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #获取列表所有值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #获取列表在给定范围的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list four #将值推入列表的右端(头部)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list #移除列表第一个值
"three"
127.0.0.1:6379> rpop list #移除列表最后一个值
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 #移除列表指定下标的值
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> llen list #获取列表的长度
(integer) 2
127.0.0.1:6379> lrem list 1 one #遍历然后移除一个指定的值(列表中值可以重复)
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "two"
127.0.0.1:6379> lrem list 2 two #遍历然后移除一个指定的值(列表中值可以重复)
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "three"

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2  #通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"

组合命令

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist otherlist #移除列表的最后一个元素,将它移到新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange otherlist 0 -1
1) "hello2"
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 value1
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "value1"
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 other #指定下标的值不存在,更新失败
(error) ERR index out of range

linsert:将某个具体的值插入到列表中某个元素的前面或后面

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after "world" "new"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"

Set

127.0.0.1:6379> sadd myset "hello" #添加值到set集合
(integer) 1
127.0.0.1:6379> sadd myset "hello1"
(integer) 1
127.0.0.1:6379> sadd myset "hello2"
(integer) 1
127.0.0.1:6379> smembers myset #查看set的所有值
1) "hello2"
2) "hello"
3) "hello1"
127.0.0.1:6379> sismember myset hello #判断某个值是不是在set集合中
(integer) 1
127.0.0.1:6379> sismember myset world
(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> scard myset
(integer) 2
127.0.0.1:6379> smembers myset
1) "hello2"
2) "hello1"
127.0.0.1:6379> srandmember myset #随机抽选出一个元素
"hello1"
127.0.0.1:6379> srandmember myset
"hello2"
127.0.0.1:6379> srandmember myset 2 #随机抽选出指定个数元素
1) "hello2"
2) "hello1"
127.0.0.1:6379> spop myset #随机删除set集合中的元素
"hello2"
127.0.0.1:6379> smembers myset
1) "hello1"

127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "zzf"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "zzf" #将一个指定的值,移动到另一个set
(integer) 1
127.0.0.1:6379> smembers myset
1) "hello"
2) "world"
127.0.0.1:6379> smembers myset2
1) "zzf"
2) "set2"

127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key2 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key1 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 #差集,key1有,key2没有
1) "a"
2) "d"
127.0.0.1:6379> sdiff key2 key1 #差集,key2有,key1没有
1) "b"
2) "e"
127.0.0.1:6379> sinter key1 key2 #交集
1) "c"
127.0.0.1:6379> sunion key1 key2 #并集
1) "d"
2) "e"
3) "c"
4) "a"
5) "b"

Hash

127.0.0.1:6379> hset myhash f1 zzf #加入一个具体的key-value
(integer) 1
127.0.0.1:6379> hget myhash f1 #获取一个key的值
"zzf"
127.0.0.1:6379> hmset myhash f1 hello f2 world #加入多个具体的key-value
OK
127.0.0.1:6379> hmget myhash f1 f2 #获取多个key的值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash
1) "f1"
2) "hello"
3) "f2"
4) "world"

127.0.0.1:6379> hdel myhash f1 #删除hash中的key,对应的值也会被删除
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "f2"
2) "world"
127.0.0.1:6379> hlen myhash #获取当前hash有多少个键值对
(integer) 1
127.0.0.1:6379> exists myhash f1 #判断当前hash是否存在key值
(integer) 1
127.0.0.1:6379> exists myhash f3
(integer) 1
127.0.0.1:6379> hkeys myhash #只获取hash中的key
1) "f2"
127.0.0.1:6379> hvals myhash #只获取hash中的值
1) "world"
127.0.0.1:6379> hset myhash f3 5
(integer) 1
127.0.0.1:6379> hincrby myhash f3 1 #设置增量
(integer) 6
127.0.0.1:6379> hincrby myhash f3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash f4 hello #如果key不存在可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash f4 world #如果key存在会设置失败
(integer) 0
127.0.0.1:6379> hgetall myhash
1) "f2"
2) "world"
3) "f3"
4) "5"
5) "f4"
6) "hello"

ZSet(有序集合)

127.0.0.1:6379> zadd myset 1 one #添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1 #查看zset内的值
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zadd salary 500 a1
(integer) 1
127.0.0.1:6379> zadd salary 1000 a2
(integer) 1
127.0.0.1:6379> zadd salary 2000 a3
(integer) 1
127.0.0.1:6379> zrangebyscore salary -inf +inf #显示全部用户,从小到大排序
1) "a1"
2) "a2"
3) "a3"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示全部用户,从小到大排序,附带值
1) "a1"
2) "500"
3) "a2"
4) "1000"
5) "a3"
6) "2000"
127.0.0.1:6379> zrem salary a1 #移除指定值
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 #根据score值从小到大排序展示
1) "a2"
2) "a3"
127.0.0.1:6379> zcard salary #查看当前zset的大小
(integer) 2
127.0.0.1:6379> zrevrange salary 0 -1 #根据score值从大到小排序展示
1) "a3"
2) "a2"

127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 zzf
(integer) 2
127.0.0.1:6379> zcount myset 1 3 #获取指定区间元素个数
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

geospatial地理位置

getadd #添加地理位置(经度 纬度 城市名称)
规则:两极无法直接添加,一般会下载城市数据,直接通过Java程序导入

127.0.0.1:6379> geoadd china:city 116.60 39.90 beijin
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2

获得当前定位

127.0.0.1:6379> geopos china:city beijin
1) 1) "116.60000056028366089"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijin chongqin
1) 1) "116.60000056028366089"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"

查看两个城市的直线距离,单位km

127.0.0.1:6379> geodist china:city beijin shanghai km

"1059.7683"
127.0.0.1:6379> geodist china:city chongqin shanghai km
"1447.6737"

127.0.0.1:6379> georadius china:city 110 30 1000 km #以该经纬度为中心,寻找方圆1000km内的城市
1) "chongqin"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist #显示直线距离
1) 1) "chongqin"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1 #显示直线距离、经纬度,数量是一个
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 3
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"

找出位于指定元素周围的其它元素

127.0.0.1:6379> georadiusbymember china:city beijin 1000 km
1) "beijin"
2) "xian"

该命令将返回11个字符的Geohash字符串
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么距离越近

127.0.0.1:6379> geohash china:city beijin chongqin
1) "wx4fvr9d2g0"
2) "wm5xzrybty0"

GEO底层的实现原理是ZSet,可以用ZSet命令操作geo

Hyperloglog

可以用于网站统计用户数量

127.0.0.1:6379> pfadd mykey a b c d e f g h i j #创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount mykey #统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j k l m n z x c v b #创建第二组元素
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 11
127.0.0.1:6379> pfmerge mykey3 mykey3 mykey mykey2 #合并两组
OK
127.0.0.1:6379> pfcount mykey3 #查看并集数量
(integer) 17

Bitmaps

位存储
统计用户信息(一般两个状态)

127.0.0.1:6379> setbit sign 1 0 
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0
127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0
127.0.0.1:6379> bitcount sign #统计1的数量
(integer) 2

参考

Redis实战
https://www.bilibili.com/video/BV1S54y1R7SB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值