Redis缓存技术(一)

为什么需要缓存

    我们发现,当很多网页的首页加载时,需要查询的数据非常多:大广告、小广告、楼层、商品类目信息等等。
首页的访问量非常大,如果每次都访问后台接口,查询所有的数据,会大大增加数据加载所需的时间。
然而这些信息一般更新的频率比较低,短时间内不会发生改变。
    因此,我们可以考虑在前台系统中,增加一层缓存,把这些数据缓存起来,请求到来时,不再查询后台接口,而是直接读取缓存中的数据。
这样就能大大减少首页加载所需时间,提高并发性能.

技术选型Redis和Memcached

  1. 两者有什么区别?
    从性能来看:
    redis:单线程,因此在大数据量的情况下,略逊色于Memcache
    Memcache:多线程,性能强劲,但是在数据量不大时,优势不明显

  2. 从存储方式来看:
    redis:支持数据持久化和主从备份。数据更安全,可以搭建集群
    Memcache:数据存于内存,没有持久化功能

  3. 从数据结构来看:
    redis:除了基本的k-v 结构外,支持多种复杂结构
    Memcache:只支持基本k-v 结构

结论:
如果对持久化、数据结构和处理有复杂要求的,肯定使用Redis;如果仅仅是基本的key-value结构的基本get和set需求,建议使用memcache

redis特性

redis特性

CentOS下设置自动启动

vim /etc/init.d/redis

#!/bin/sh
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database
PATH=/usr/local/bin:/sbin:/usr/bin:/bin

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid

CONF="/usr/local/src/redis-3.0.2/redis.conf"

case "$1" in  
    start)  
        if [ -f $PIDFILE ]  
        then  
                echo "$PIDFILE exists, process is already running or crashed"  
        else  
                echo "Starting Redis server..."  
                $EXEC $CONF  
        fi  
        if [ "$?"="0" ]   
        then  
              echo "Redis is running..."  
        fi  
        ;;  
    stop)  
        if [ ! -f $PIDFILE ]  
        then  
                echo "$PIDFILE does not exist, process is not running"  
        else  
                PID=$(cat $PIDFILE)  
                echo "Stopping ..."  
                $REDIS_CLI -p $REDISPORT SHUTDOWN  
                while [ -x ${PIDFILE} ]  
               do  
                    echo "Waiting for Redis to shutdown ..."  
                    sleep 1  
                done  
                echo "Redis stopped"  
        fi  
        ;;  
   restart|force-reload)  
        ${0} stop  
        ${0} start  
        ;;  
  *)  
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  
        exit 1  
esac

redis通用操作指令

1.keys命令:获取符合规则的键名列表

语法:keys pattern
示例:keys *   (查询所有的键)

2.EXISTS指令:判断一个键是否存在,如果存在返回整数1,否则返回0

语法:EXISTS key

3.DEL:删除键,可以删除一个或多个键,返回值是删除的键的个数

语法:DEL key [key … ]

4.TYPE :Redis中支持的数据类型:string(字符串的key-value)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合)
使用type可以获取键值的数据类型。

语法:TYPE key [key …]
实例:
redis 127.0.0.1:6379> keys *
1) "username2"
redis 127.0.0.1:6379> type username2
string

5.HELP

help +tab 键

Redis字符串

1.概述

字符串结构,其实是Redis中最基础的K-V结构。其键和值都是字符串。类似Java的Map<String,String>

2.常用命令:

序号          命令及描述
1           SET key value :设置指定 key 的值

2           GET key :获取指定 key 的值。

3           GETRANGE key start end :返回 key 中字符串值的子字符

4           INCR key:将 key 中储存的数字值增一。

5           INCRBY key increment:将 key 所储存的值加上给定的增量值(increment) 。

6           DECR key:将 key 中储存的数字值减一。

7           DECRBY key decrement:key 所储存的值减去给定的减量值(decrement) 。

8           APPEND key value:如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

9           STRLEN key:返回 key 所储存的字符串值的长度。

10          MGET key1 [key2..]:获取所有(一个或多个)给定 key 的值。

11          MSET key value [key value ...]:同时设置一个或多个 key-value 对。

3.基本语法:

  • set&get
    SET key value 设置指定 key 的值
    GET key 获取指定 key 的值。
127.0.0.1:6379> set name "lucy"
OK
127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379> 
  • INCR和INCRBY(数字自增)
    INCR 命令将 key 中储存的数字值增一。
    语法:INCR keyName
    返回值:执行INCR命令后key 的值

示例1: 当key没有值时:(先初始化为0,再+1)

127.0.0.1:6379> get id
(nil)
127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> get id
"1"

示例2 : 当key有值,并且也是数值:(直接值+1)

127.0.0.1:6379> set numb 100
OK
127.0.0.1:6379> get numb
"100"
127.0.0.1:6379> incr numb
(integer) 101
127.0.0.1:6379> get numb
"101"

示例3: 当key有值,但是不是数值形式:(会报错)

127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
注意:

1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
3) 数字值在Redis中以字符串保存

  • INCRBY
    INCRBY与INCR命令基本类似, INCRBY命令将 key 中储存的数字加上指定的增量值。
    语法: INCRBY key_name incr_amount
127.0.0.1:6379> get id
"1"
127.0.0.1:6379> incrby id 10
(integer) 11
127.0.0.1:6379> get id
"11"
  • DECR和DECRBY(数值自减)
    Decr 命令将 key 中储存的数字值减一。
    语法:DECR key_name
注意:

1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
3) 数字值在Redis中以字符串保存

  • APPEND(追加数据)
    Append 命令用于为指定的 key 追加值。
    1) 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
    2) 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
    语法: APPEND key value
    示例1:对一个不存在的数据进行操作
127.0.0.1:6379> get msg
(nil)
127.0.0.1:6379> append msg hello
(integer) 5

示例2:操作一个已经有值的key

127.0.0.1:6379> get name
"lucy"
127.0.0.1:6379> append name jack
(integer) 8
  • STRLEN(字符串长度)
    Strlen 命令用于获取指定 key 所储存的字符串值的长度。
    语法:STRLEN key
    返回值:key的值字符串长度,如果key不存在,返回0

  • MSET&MGET(批量添加和获取)
    Mset 命令用于同时设置一个或多个 key-value 对。
    语法:MSET key1 value1 key2 value2 … keyN valueN
    Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil
    语法:MGET KEY1 KEY2 .. KEYN

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值