Redis初识

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、valueHKEYS/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"

连接:通过本地配置文件进行连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值