Redis学习指南

Redis学习指南

一、数据结构

  • string(字符串)
  • list(列表)
  • set(集合)
  • hash(散列)
  • zset(有序集合)

二、命令列表

2.1 Redis Strings

> set mykey somevalueOK> get mykey"somevalue"
> set counter 100OK> incr counter(integer) 101> incr counter(integer) 102> incrby counter 50(integer) 152
> mset a 10 b 20 c 30OK> mget a b c1) "10"2) "20"3) "30"
> set mykey helloOK> exists mykey(integer) 1> del mykey(integer) 1> exists mykey(integer) 0
> set mykey xOK> type mykeystring> del mykey(integer) 1> type mykeynone
> set key some-valueOK> expire key 5(integer) 1> get key (immediately)"some-value"> get key (after some time)(nil)
> set key 100 ex 10OK> ttl key(integer) 9

2.2 Redis Lists

> rpush mylist A(integer) 1> rpush mylist B(integer) 2> lpush mylist first(integer) 3> lrange mylist 0 -11) "first"2) "A"3) "B"
> rpush mylist 1 2 3 4 5 "foo bar"(integer) 9> lrange mylist 0 -11) "first"2) "A"3) "B"4) "1"5) "2"6) "3"7) "4"8) "5"9) "foo bar"
> rpush mylist a b c(integer) 3> rpop mylist"c"> rpop mylist"b"> rpop mylist"a"
> rpush mylist 1 2 3 4 5(integer) 5> ltrim mylist 0 2OK> lrange mylist 0 -11) "1"2) "2"3) "3"
> brpop tasks 51) "tasks"2) "do_something"

2.3 Redis Hashes

> hmset user:1000 username antirez birthyear 1977 verified 1OK> hget user:1000 username"antirez"> hget user:1000 birthyear"1977"> hgetall user:10001) "username"2) "antirez"3) "birthyear"4) "1977"5) "verified"6) "1"
> hmget user:1000 username birthyear no-such-field1) "antirez"2) "1977"3) (nil)
> hincrby user:1000 birthyear 10(integer) 1987> hincrby user:1000 birthyear 10(integer) 1997

2.4 Redis Sets

> sadd myset 1 2 3(integer) 3> smembers myset1. 32. 13. 2

2.5 Redis Sorted Sets

> zadd hackers 1940 "Alan Kay"(integer) 1> zadd hackers 1957 "Sophie Wilson"(integer) 1> zadd hackers 1953 "Richard Stallman"(integer) 1> zadd hackers 1949 "Anita Borg"(integer) 1> zadd hackers 1965 "Yukihiro Matsumoto"(integer) 1> zadd hackers 1914 "Hedy Lamarr"(integer) 1> zadd hackers 1916 "Claude Shannon"(integer) 1> zadd hackers 1969 "Linus Torvalds"(integer) 1> zadd hackers 1912 "Alan Turing"(integer) 1?> zrange hackers 0 -11) "Alan Turing"2) "Hedy Lamarr"3) "Claude Shannon"4) "Alan Kay"5) "Anita Borg"6) "Richard Stallman"7) "Sophie Wilson"8) "Yukihiro Matsumoto"9) "Linus Torvalds"

三、应用示例

3.1 分布式锁

需要安装nuget包:StackExchange.Redis。

using StackExchange.Redis;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;?namespace Redlock.CSharp{    public class Lock    {?        public Lock(RedisKey resource, RedisValue val, TimeSpan validity)        {            this.resource = resource;            this.val = val ;            this.validity_time = validity;        }?        private RedisKey resource;?        private RedisValue val;?        private TimeSpan validity_time;?        public RedisKey Resource { get { return resource; } }?        public RedisValue Value { get { return val; } }?        public TimeSpan Validity { get { return validity_time; } }    }}?
using StackExchange.Redis;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;?namespace Redlock.CSharp{    public class Redlock    {?        public Redlock(params ConnectionMultiplexer[] list)        {             foreach(var item in list)                this.redisMasterDictionary.Add(item.GetEndPoints().First().ToString(),item);        }?        const int DefaultRetryCount = 3;        readonly TimeSpan DefaultRetryDelay = new TimeSpan(0, 0, 0, 0, 200);        const double ClockDriveFactor = 0.01;?        protected int Quorum { get { return (redisMasterDictionary.Count / 2) + 1; } }?        /// <summary>        /// String containing the Lua unlock script.        /// </summary>        const String UnlockScript = @"            if redis.call(""get"",KEYS[1]) == ARGV[1] then                return redis.call(""del"",KEYS[1])            else                return 0            end";??        protected static byte[] CreateUniqueLockId()        {            return Guid.NewGuid().ToByteArray();        }??        protected Dictionary<String,ConnectionMultiplexer> redisMasterDictionary = new Dictionary<string,ConnectionMultiplexer>();?        //TODO: Refactor passing a ConnectionMultiplexer        protected bool LockInstance(string redisServer, string resource, byte[] val, TimeSpan ttl)        {                        bool succeeded;            try            {                var redis = this.redisMasterDictionary[redisServer];                succeeded = redis.GetDatabase().StringSet(resource, val, ttl, When.NotExists);            }            catch (Exception)            {                succeeded = false;            }            return succeeded;        }?        //TODO: Refactor passing a ConnectionMultiplexer        protected void UnlockInstance(string redisServer, string resource, byte[] val)        {            RedisKey[] key = { resource };            RedisValue[] values = { val };            var redis = redisMasterDictionary[redisServer];            redis.GetDatabase().ScriptEvaluate(                UnlockScript,                 key,                values                );        }?        public bool Lock(RedisKey resource, TimeSpan ttl, out Lock lockObject)        {            var val = CreateUniqueLockId();            Lock innerLock = null;            bool successfull = retry(DefaultRetryCount, DefaultRetryDelay, () =>            {                try                {                    int n = 0;                    var startTime = DateTime.Now;?                    // Use keys                    for_each_redis_registered(                        redis =>                        {                            if (LockInstance(redis, resource, val, ttl)) n += 1;                        }                    );?                    /*                     * Add 2 milliseconds to the drift to account for Redis expires                     * precision, which is 1 millisecond, plus 1 millisecond min drift                      * for small TTLs.                             */                    var drift = Convert.ToInt32((ttl.TotalMilliseconds * ClockDriveFactor) + 2);                    var validity_time = ttl - (DateTime.Now - startTime) - new TimeSpan(0, 0, 0, 0, drift);?                    if (n >= Quorum && validity_time.TotalMilliseconds > 0)                    {                        innerLock = new Lock(resource, val, validity_time);                        return true;                    }                    else                    {                        for_each_redis_registered(                            redis =>                            {                                UnlockInstance(redis, resource, val);                            }                        );                        return false;                    }                }                catch (Exception)                { return false; }            });?            lockObject = innerLock;            return successfull;        }?        protected void for_each_redis_registered(Action<ConnectionMultiplexer> action)        {            foreach (var item in redisMasterDictionary)            {                action(item.Value);            }        }?        protected void for_each_redis_registered(Action<String> action)        {            foreach (var item in redisMasterDictionary)            {                action(item.Key);            }        }?        protected bool retry(int retryCount, TimeSpan retryDelay, Func<bool> action)        {            int maxRetryDelay = (int)retryDelay.TotalMilliseconds;            Random rnd = new Random();            int currentRetry = 0;?            while (currentRetry++ < retryCount)            {                if (action()) return true;                Thread.Sleep(rnd.Next(maxRetryDelay));            }            return false;        }?        public void Unlock(Lock lockObject)        {            for_each_redis_registered(redis =>                {                    UnlockInstance(redis, lockObject.Resource, lockObject.Value);                });        }?        public override string ToString()        {            StringBuilder sb = new StringBuilder();            sb.AppendLine(this.GetType().FullName);?            sb.AppendLine("Registered Connections:");            foreach(var item in redisMasterDictionary)            {                sb.AppendLine(item.Value.GetEndPoints().First().ToString());            }?            return sb.ToString();        }    }}?

原文地址:https://www.cnblogs.com/xsddxz/p/11288242.html

时间: 2024-10-10 09:21:24

Redis学习指南的相关文章

redis 学习指南

一.介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.一个高性能的key-value数据库.并提供多种语言的API.说到Key-Value数据库NoSQL数据库可以想到MongoDB. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及

Redis入门指南

随着互联网业务对性能需求日益强烈,作为Key/Value存储的Redis具有数据类型丰富和性能表现优异的特点.如果能够熟练地驾驭它,不管是把它用做缓存还是存储,对很多大型应用都很多帮助.新浪作为世界上最大的Redis使用者,体会到了Redis为高并发在线业务带来的好处,但同时也遇到了很多挑战,新浪为推动Redis这种NoSQL产品在中国互联网产品技术架构中的使用做出了卓越的贡献.作为国内第一本推进Redis普及的书,此书比较详细地介绍了Redis入门必备的基础知识,同时拥有了一些实践性方面的章节

Redis学习笔记(一)关于在windows64位环境下的安装学习使用

前言 由于工作需要,目前我正在学习使用Redis.我当时学习Redis就从网上下载了点资料就开始学习了.入门看的是<REDIS入门指南>,这本书个人觉得很适合新手用来学习接触.根据书上的引导,学习Redis需要首先要安装Redis.我在安装Redis的过程中遇到了许多问题,由于我的的电脑是Windows64的,也没有POSIX系统和OS X系统的机子,于是就只能在Windows环境下安装,根据书上所说,需要先安装Cygwin(Cygwin能够在Windows环境下模拟Linux系统环境).鼓捣

redis学习笔记——应用场景

最近在看redis入门指南,现在就自己的学习情况说说自己的理解. 字符串类型(String) 字符串类型是Redis中最基本的类型,能存储任意形式的字符串,包括二进制数据.如一张照片也可以用字符串类型存储.注意字符串类型键允许存储的数据最大容量是512M. Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.除了get.set.incr.decr 等操作外,Redis还提供了下面一些操作: 获取字符串长度:往字符串append内容:设置和获取字

Java工程师学习指南

java学习指南-四个部分:分别是入门篇,初级篇,中级篇,高级篇 第一步是打好Java基础,掌握Java核心技术,                                               ---入门篇 第二步是掌握Java Web技术栈,能够做一些项目,                                       ---初级篇 第三步是掌握Java方面的进阶技术,包括网络编程.并发编程.JVM等,     ---中级篇 第四步是掌握后端进阶技术,比如分布式.缓

Java工程师学习指南(完结篇)

Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校生,所以写的内容主要还是针对Java初学者或者接触Java后端不久的朋友,不适用于已经工作多年的Java大佬们.所以本文中的方法不一定适合所有人,如有错误还请谅解. 本期的内容是系列文章的最后一部分内容了.这个系列可能还有很多东西没有说清楚,也有很多内容被忽略了.但是这些内容也确实是笔者结合自己经验

servlet和jsp学习指南(一)servlet

近期接触了些纯servlet与jsp的编程项目,顺便把<servlet和jsp学习指南>这本书拿出来看看,感悟良多.记下随笔,以便会议. 要编写一个servlet首先要实现Servlet或者继承HttpServlet package test.com.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet

Redis学习笔记

Redis学习笔记:Redis是什么?redis是开源BSD许可高级的key-vlue存储系统可以用来存储字符串哈希结构链表.结构.集合,因此常用来提供数据结构服务. redis和memcache相比的独特之处:1.redis可以用来做存储,而memcache是用来做缓存 这个特点主要因为其有"持久化"的功能.2.存储的数据有"结构",对于memcache来说,存储的数据只有1种类型"字符串"而 redis则可以存储字符串.链表.哈希机构.集合.

(转)redis 学习笔记(1)-编译、启动、停止

redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8.17 1.2 上传到linux,然后运行以下命令解压 tar xzf redis-2.8.17.tar.gz 1.3 编译 cd redis-2.8.17make 注:make命令需要linux上安装gcc,若机器上未安装gcc,redhat环境下,如